无法将预期类型 'MultTree b' 与“[MultTree b]”匹配
Couldn't match expected type 'MultTree b' with '[MultTree b]'
我对 Haskell 比较陌生。
我正在尝试创建一个 函数 zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c
,其行为类似于列表的函数 zipWith
。它应该使用 a -> b -> c
.
类型的给定函数组合两个输入树
MultTree 表示 non-empty 棵树,其节点可能有任意多个 children:
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
return 是一个简单的 MultTree
,所以对于 MultNode (f x y) (zipWithMult f xs ys)
我们有一个问题。
您可以使用 zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
来处理两个列表(第一个和第二个参数的项目),并且 return 这是一个 MultTree
的列表:
zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c
zipWithMult f (MultNode x xs) (MultNode y ys)
= MultNode (f x y) (<b>zipWith (zipWithMult f)</b> xs ys)
对于给定的样本数据,我们得到:
Prelude> zipWithMult (+) t1 t2
MultNode 6 [MultNode 8 [MultNode (-40) [],MultNode 11 []],MultNode (-5) [MultNode 7 []]]
我对 Haskell 比较陌生。
我正在尝试创建一个 函数 zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c
,其行为类似于列表的函数 zipWith
。它应该使用 a -> b -> c
.
MultTree 表示 non-empty 棵树,其节点可能有任意多个 children:
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
return 是一个简单的 MultTree
,所以对于 MultNode (f x y) (zipWithMult f xs ys)
我们有一个问题。
您可以使用 zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
来处理两个列表(第一个和第二个参数的项目),并且 return 这是一个 MultTree
的列表:
zipWithMult :: (a -> b -> c) -> MultTree a -> MultTree b -> MultTree c
zipWithMult f (MultNode x xs) (MultNode y ys)
= MultNode (f x y) (<b>zipWith (zipWithMult f)</b> xs ys)
对于给定的样本数据,我们得到:
Prelude> zipWithMult (+) t1 t2
MultNode 6 [MultNode 8 [MultNode (-40) [],MultNode 11 []],MultNode (-5) [MultNode 7 []]]