Haskell 如何为可以保存单个值或列表值的数据类型声明函数?
我正在尝试创建一个树,其中每个节点可以有0-2个子节点,叶子包含列表: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]是
数据测试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给出的签名相匹配。