【问题标题】:Couldn't match expected type 'MultTree b' with '[MultTree b]'无法将预期类型“MultTree b”与“[MultTree b]”匹配
【发布时间】:2021-05-08 10:36:20
【问题描述】:

我对 Haskell 比较陌生。

我正在尝试创建一个 函数 zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c,其行为类似于用于列表的函数 zipWith。它应该使用a -> b -> c 类型的给定函数组合两个输入树。

MultTree 表示其节点可能有任意多个子节点的非空树:

data MultTree a = MultNode a [MultTree a] deriving Show

例如,当我有以下两棵树时:

t1 :: MultTree Integer
t1 = MultNode 8 [MultNode 3 [MultNode (-56) [], MultNode 4 [], MultNode 987 []], MultNode 4 [MultNode 6 []]]

t2 :: MultTree Integer
t2 = MultNode (-2) [MultNode 5 [MultNode 16 [], MultNode 7 []], MultNode (-9) [MultNode 1 [], MultNode 5 []]]

函数zipWithMult (+) t1 t2的应用应该会导致:

MultNode 6 [MultNode 8 [MultNode (-40) [], MultNode 11 []], MultNode (-5) [MultNode 7 []]] 

在其他树中没有对应节点的节点应该被简单地删除。

到目前为止我所拥有的:

zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c
zipWithMult f (MultNode x []) (MultNode y ys) = MultNode (f x y) []
zipWithMult f (MultNode x xs) (MultNode y []) = MultNode (f x y) []
zipWithMult f (MultNode x xs) (MultNode y ys) = MultNode (f x y) (zipWithMult f xs ys)

我不明白为什么我在zipWithMult 中的第三次表达会出现此错误

Couldn't match expected type `MultTree b'
              with actual type `[MultTree b]'
* In the third argument of `zipWithMult', namely `ys'
  In the second argument of `MultNode', namely
    `(zipWithMult f xs ys)'
  In the expression: MultNode (f x y) (zipWithMult f xs ys)

我觉得我在 Haskell 中的语法有误,但我不确定。

【问题讨论】:

  • zipWithMult 返回一个简单的MultTree,所以对于MultNode (f x y) (zipWithMult f xs ys),我们遇到了问题。

标签: haskell syntax tree zipwith


【解决方案1】:

zipWithMult 返回一个简单的MultTree,所以对于MultNode (f x y) (zipWithMult f xs ys) 我们有问题。

您可以使用zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] 处理两个列表(第一个和第二个参数的项目),并将其作为MultTrees 的列表返回:

zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c
zipWithMult f (MultNode x xs) (MultNode y ys)
    = MultNode (f x y) (zipWith (zipWithMult f) xs ys)

对于给定的样本数据,我们得到:

Prelude> zipWithMult (+) t1 t2
MultNode 6 [MultNode 8 [MultNode (-40) [],MultNode 11 []],MultNode (-5) [MultNode 7 []]]

【讨论】:

  • 感谢您的干净回答!我现在明白了
猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2020-10-17
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多