Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell定义二叉树_Haskell_Functional Programming_Binary Tree - Fatal编程技术网

Haskell定义二叉树

Haskell定义二叉树,haskell,functional-programming,binary-tree,Haskell,Functional Programming,Binary Tree,我想在Haskell中使用infinitree::tree定义一个无限树,但我想为每个节点设置一个模式,定义每个节点应该是什么。该模式比其父模式多1个。我正在努力研究如何建立一个树,如何以及在哪里定义每个节点的模式 谢谢无限数据结构通常可以由调用自身但没有基本大小写的函数定义。通常,这些函数不需要在其参数上进行模式匹配。例如,等于[1..]的列表可以写成 infiniteList :: [Int] infiniteList = go 1 where go n = n : go (n+1)

我想在Haskell中使用infinitree::tree定义一个无限树,但我想为每个节点设置一个模式,定义每个节点应该是什么。该模式比其父模式多1个。我正在努力研究如何建立一个树,如何以及在哪里定义每个节点的模式


谢谢

无限数据结构通常可以由调用自身但没有基本大小写的函数定义。通常,这些函数不需要在其参数上进行模式匹配。例如,等于
[1..]
的列表可以写成

infiniteList :: [Int]
infiniteList = go 1 where 
  go n = n : go (n+1) 
您可以对树使用完全相同的技术:

data Tree a = Node (Tree a) a (Tree a) | Nil deriving (Show)

infiniteTree :: Tree Int 
infiniteTree = go 1 where 
  go n = Node (go (2*n)) n (go (2*n+1))
这定义了无限树

   1 
 /   \
 2   3 
/ \ / \
4 5 6 7
...

无限数据结构通常可以由调用自身但没有基本情况的函数定义。通常,这些函数不需要在其参数上进行模式匹配。例如,等于
[1..]
的列表可以写成

infiniteList :: [Int]
infiniteList = go 1 where 
  go n = n : go (n+1) 
您可以对树使用完全相同的技术:

data Tree a = Node (Tree a) a (Tree a) | Nil deriving (Show)

infiniteTree :: Tree Int 
infiniteTree = go 1 where 
  go n = Node (go (2*n)) n (go (2*n+1))
这定义了无限树

   1 
 /   \
 2   3 
/ \ / \
4 5 6 7
...

无叶的无限二叉树的一种类型:

data Tree a = Tree (Tree a) a (Tree a)
执行此类操作的一种通用模式称为
展开
。对于此特定类型:

unfold :: (a -> (a,b,a)) -> a -> Tree b

您能看到如何定义此函数并将其用于您的目的吗?

无叶无限二叉树的类型:

data Tree a = Tree (Tree a) a (Tree a)
执行此类操作的一种通用模式称为
展开
。对于此特定类型:

unfold :: (a -> (a,b,a)) -> a -> Tree b

你能看到如何定义这个函数并将其用于你的目的吗?

谢谢,这更有意义。不。因此,如果我想让一棵树的根为0,它的子项为值,然后它的父项为1,那么我可以这样做:数据树a=节点(树a)a(树a)|零派生(可折叠,显示)infiniteTree::Tree Int infiniteTree=go 0其中go n=Node(go(1+n))n(go(1+n))?如果需要,应该在Node a n a中编写
go n=let a=go(1+n)
,因为您不希望计算两次
go(n+1)
调用,他们经常对参数进行模式匹配。谢谢,这更有意义。不。因此,如果我希望根的树为0,子的值为1,那么它的父级,我可以这样做:数据树a=节点(树a)a(树a)|零派生(可折叠,显示)infiniteTree::Tree Int infiniteTree=go 0其中go n=Node(go(1+n))n(go(1+n))?如果需要,应该在Node a n a中编写
go n=let a=go(1+n)
,因为您不希望计算两次
go(n+1)
调用,他们经常对自己的参数进行模式匹配。数据树=空|节点整数树树派生Show infiniteree::Tree infiniteree=go 1 where go n=let a=go(1+n)在节点a中n a类似的东西?@YangMi,我不知道你的意思。我的建议是,为我为您提供的
unfold
函数定义一个类型签名将是一个很好的练习。data Tree=Empty | Node Integer Tree Tree派生Show infiniteree::Tree infiniteree=go 1 where go n=let a=go(1+n)在Node a n a类似的地方?@YangMi,我不知道你的意思。我建议为我给你的
unfold
函数定义一个类型签名,这将是一个很好的练习。你知道你想以什么方式使用无限树吗?你知道你想以什么方式使用无限树吗?