Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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 - Fatal编程技术网

Haskell 如何为可以保存单个值或列表值的数据类型声明函数?

Haskell 如何为可以保存单个值或列表值的数据类型声明函数?,haskell,Haskell,我正在尝试创建一个树,其中每个节点可以有0-2个子节点,叶子包含列表: 数据测试aa=Leaf[aa]| Treenode(TTT-aa)(TTT-aa)|空派生显示 例如,如果aa将是Int,那么leaves将保持[Int] 如何编写接受此类数据的函数定义?我试过: f::(aa->aa)->测试aa->测试aa 这会产生错误:无法将预期类型“aa”与实际类型“[aa]”匹配,因为Leaf[aa]是一个列表,而不是单个值 我认为这不会是一个问题,因为函数接收类型为Test的参数,列表[aa]是

我正在尝试创建一个树,其中每个节点可以有0-2个子节点,叶子包含列表:
数据测试aa=Leaf[aa]| Treenode(TTT-aa)(TTT-aa)|空派生显示

例如,如果
aa
将是
Int
,那么leaves将保持
[Int]

如何编写接受此类数据的函数定义?我试过:
f::(aa->aa)->测试aa->测试aa

这会产生错误:
无法将预期类型“aa”与实际类型“[aa]”匹配
,因为
Leaf[aa]
是一个列表,而不是单个值

我认为这不会是一个问题,因为函数接收类型为
Test
的参数,列表
[aa]
是参数
Test
的内容,而不是参数本身,如果这有意义的话。

数据类型应该是:

data Test aa = Leaf [aa] | Treenode (Test aa) (Test aa) | Empty deriving Show
然后,例如,您可以使用树创建一个
map
函数:

f :: (aa -> aa) -> Test aa -> Test aa
f _ Empty = Empty
f g (Leaf xs) = Leaf $ map g xs
f g (Treenode x y) = Treenode (f g x) (f g y)

Prelude> f (1+) (Treenode (Leaf [1,2]) (Leaf [3,4]))
Treenode (Leaf [2,3]) (Leaf [4,5])

寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:对于未定义的类型
TTT
f
只是
fmap
,您应该会得到一个“不在范围内”错误,因此您也可以为
树定义一个
Functor
实例。是的,但这不是问题的目的。我之所以举这个例子,是因为它与@RobertK给出的签名相匹配。