我对haskell非常陌生,只是我似乎无法理解这段代码:
data Tree a = Empty | Leaf a | Node a (Tree a) (Tree a)
-- animals tree
animals :: Tree String
animals = Node "elephant"
(Node "bat"
(Leaf "aardvark")
(Node "cow"
(Le
我不懂haskell语法,但我知道一些FP概念(如代数数据类型、模式匹配、高阶函数等)。
有人能解释一下吗,这段代码是什么意思:
data Tree ? = Leaf ? | Fork ? (Tree ?) (Tree ?)
rotateR tree = case tree of
Fork q (Fork p a b) c -> Fork p a (Fork q b c)
据我所知,第一行类似于树类型声明(但我并不完全理解它)。第二行包括模式匹配(我也不明白为什么我们需要在这里使用模式匹配)。对于非haskell开发人员来说,第三行代码做了一些绝对不可读的事情。我已经找到了将For
我正在阅读纯粹的函数数据结构,并试图解决他们在haskell中进行的练习。
我已经以标准的方式定义了Tree,data Tree a = Empty | Node a (Tree a) (Tree a),我想将Set定义为Tree,其中节点是Ord的实例。有没有办法用Haskell来表达这一点?像type Set = Tree Ord这样的东西,或者我每次想把一些数据结构表示为树时,都会考虑重新实现树?
我正在尝试编写一个haskell函数,它将返回整数二叉树中的最大int。我的二叉树定义如下:
data Tree = Node Int Tree Tree | Leaf Int
deriving (Eq,Show)
我对这个声明的理解是,对于'Tree‘数据类型,它可以是一个单叶int,也可以是一个包含两个以上树的子树。所以我的maxInt函数看起来像这样(我想)
maxInt :: Tree -> Int --maxInt function receives Tree, returns int
maxInt --something to detect if the T
通过阅读,我被变形困住了。不幸的是,这个部分很薄,维基百科的页面什么也没说。
我的Haskell翻译是:
para :: (a -> [a] -> b -> b) -> b -> [a] -> b
para f base = h
where
h [] = base
h (x:xs) = f x xs (h xs)
但我不觉得--我对类型签名或期望的结果没有任何直觉。
什么是蜕变,什么是有用的例子?
是的,我见过 ,但它们没有直接涉及变形,只指出了作为参考可能有用的,而不是学习材料。
我刚开始学习haskell和模式匹配。我只是不明白它是如何实现的,[]和(x:_)的计算结果是不同的类型,这种模式的函数实现由于多态性而被识别,或者我错了,还有另一种使用的技术。
head' :: [a] -> a
head' [] = error "Can't call head on an empty list, dummy!"
head' (x:_) = x
或者让我们考虑这个模式匹配函数:
tell :: (Show a) => [a] -> String
tell [] = "The list i
我们被要求在Haskell中创建一个2-3-4树,就像在编写数据类型、插入函数和显示函数一样。
我发现很难获得关于这种树的信息,即使用我熟悉的语言(Java、C++)也是如此。
到目前为止我所掌握的-
data Tree t = Empty
| Two t (Tree t)(Tree t)
| Three t t (Tree t)(Tree t)(Tree t)
| Four t t t (Tree t)(Tree t)(Tree t)(Tree t) deriving (Eq, Ord, Show)
leaf2 a = Two a Empty Empty
l
我试图在haskell中建立一些多态数据的模型。我理解为什么下面的代码不能工作,但我希望它能说明我想要做的事情。我的问题是:用Haskell来模拟这件事的惯用方法是什么?(如果有更好的方法,您不需要保持输入格式相同--我没有任何现有的代码或数据。)
data Running = Sprint | Jog deriving (Show)
data Lifting = Barbell | Dumbbell deriving (Show)
data Time = Time Integer deriving (Show)
data Pounds = Pounds Integer derivi
Haskell中的列表可能如下所示:
data List a = Nil | Cons a (List a)
一种类型理论解释是:
λα.μβ.1+αβ
将列表类型编码为函子的不动点。在Haskell,可以代表这一点:
data Fix f = In (f (Fix f))
data ListF a b = Nil | Cons a b
type List a = Fix (ListF a)
我对早期的μ绑定器的范围很好奇。在外部作用域中绑定的名称在内部作用域中是否仍然可用?例如,下面是一个有效的表达式:
μγ.1+(μβ.1+γβ)γ
...perhaps --它与:
μβ.μγ.1+
我遇到了以下问题:我有一个不同类的对象树,其中子类中的操作会使父类无效。在命令式语言中,这是微不足道的。例如,在Java中:
public class A {
private List<B> m_children = new LinkedList<B>();
private boolean m_valid = true;
public void invalidate() {
m_valid = false;
}
public void addChild(B child) {
m_children
在haskell,我可以做如下的事情
a :: Int
a = 15
我有如下的数据类型
data Btree a = ND | Data a | Branch (Btree a) (Btree a) deriving (Show, Eq)
如何定义树,而不是使用函数,如上面所示。
我试过了;
tree :: BTree
tree = Branch Btree (Branch ND Data 1) (Branch ND (Branch ND ND))
我似乎无法让它开始工作(我对haskell并不熟悉,所以如果这是非常基本的,我会事先道歉)
首先,我应该说我从未见过任何Haskell代码。现在我有了一个算法,我必须用另一种语言实现它。不幸的是,这个算法依赖于Haskell的一些特性和特性,所以我想请你帮忙,如何才能正确地实现它?
下面是代码:
data Utree = Tree[Utree]
instance Eq Utree where
Tree(p) == Tree(q) = p == q
instance Ord Utree where
Tree(p) <= Tree(q) = p <= q
norm(Tree(p)) = Tree(sort(map norm p))
iso p q =
我遵循了创建二进制搜索树的指南,该树使用以下数据类型:
data BinarySearchTree a = EmptyTree | TreeNode a (BinarySearchTree a) (BinarySearchTree a) deriving (Show, Read, Eq)
我说'TreeNode‘是使用递归,即创建它自己的数据类型'(BinarySearchTree a) (BinarySearchTree a)’‘的两个元素,对吗?
我从来没有见过这样的数据类型,任何简短的解释都会很棒!
我正在尝试用Haskell函数编写一个函数,它将保留列表中的每个第k个元素。
> keepl 2 [3,4,5,6,7,8,9]
[4,6,8]
我尝试了下面的函数,但输出结果不一致。我希望列表显示为3,6,但它显示为1,5,9
keepl k [] = []
keepl k (x : xs) = x : (keepl k $ drop k xs)
main = do
print $ keepl 3[1,2,3,4,5,6,7,8,9]
我正在尝试在Haskell中创建一个Tree类型。我使用了这个简单的数据构造函数来存储一个树,其中的每个节点可以是空的,可以是包含整数的叶子,也可以是包含整数的节点,其中包含两个其他叶子/节点的分支。下面是我得到的信息:
module Tree ( Tree(Empty, Leaf, Node) ) where
data Tree = Empty
| Leaf Int
| Node Tree Int Tree
deriving(Eq, Ord, Show, Read)
这很好用,但我需要使Tree类型成为多态的。我试着简单地把“Int”替换成“a”,但似乎不起作用。有没有其他系统可以让这些类
我刚开始学习Haskell,我不明白如何在Haskell中编写类似这样的程序,其中包含循环和局部变量。有人能建议这样一个项目如何看待Haskell吗?如何替换第二个周期,因为它涉及局部变量?
#include <iostream>
using namespace std;
int main() {
int n;
int a [100];
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> a[i];
}
int max = 0;
int index = -1;
for (int i = 0;
我需要在二叉树中找到所有可能的子树:
allSubtrees :: BinaryT a -> [BinaryT a]
allSubtrees = undefined
这棵树是:
data BinaryT a =
Empty
| Node (BinaryT a) a (BinaryT a)
deriving (Eq, Show)
我是Haskell的新手,我知道在Haskell中没有while for⁄循环。Haskell完全是关于递归的。我的问题是,如何在没有无限递归的情况下获得树的所有可能的子树?
当我试图在Haskell中写重复时,会弹出错误-C堆栈溢出。
repeat' :: a -> [a]
repeat' a = repeat' a ++ [a]
我知道正确的方法是:
repeat' :: a -> [a]
repeat' a = a: repeat' a
但仍然想问为什么会发生,第一个有什么问题吗?
我需要3项任务的帮助。我是Haskell和方面的新手。
data Tree = Node Int Tree Tree | Nil
借助函数collapse进行定义
崩溃::树-> Int塌陷Nil = []塌陷(节点x y z) =(折叠y) ++ x ++ (塌陷z)
一个Haskell函数check :: Tree -> Bool,它检查树是否是二进制搜索树.
我用一棵树测试它,得到2 4 7 8 10 | 5 6 10 12。在这里,您可以看到到中间的所有值都是排序的,但我不知道该如何编码。
定义一个Haskell函数insert :: Int -> T
例如,您可以在不定义递归结构的情况下在Haskell中定义列表吗?还是用某个函数替换所有列表?
data List a = Empty | (a, List a) -- <- recursive definition
编辑
我举了这个列表作为例子,但是我实际上是在询问所有的数据结构。也许对于所有需要递归的情况,我们只需要一个递归数据结构?与Y组合器一样,它是唯一需要的递归函数。@TikhonJelvis的回答让我想到了这一点。现在我确信这篇文章更适合cs.stackexchange。
关于当前所选答案的
我真的在寻找那些看起来更像戴维扬& @TikhonJelvis给出的答案,但