【发布时间】:2018-07-31 19:20:58
【问题描述】:
我正在尝试实现一个 haskell 程序,该程序使用函子增加树中所有节点的值。函子函数的输入和输出是一棵树。我正在尝试以递归方式实现它,但在输入参数方面出现编译错误。
Haskell 代码..
data Tree v = Empty | Node v (Tree v) (Tree v) deriving (Show)
add :: Ord v => v -> Tree v -> Maybe Tree v
add _ Empty = Nothing
add v (Node val left right) = (val + v) ++ add v left ++ add v right
输入
add (+1) (Node 3 (Node 1 Empty Empty) (Node 7 (Node 4 Empty Empty) Empty))
输出
[1 of 1] Compiling Main ( functor1.hs, interpreted )
functor1.hs:17:34: error:
* Expecting one fewer arguments to `Maybe Tree'
Expected kind `* -> *', but `Maybe Tree' has kind `*'
* In the type signature:
add :: Ord v => v -> Tree v -> Maybe Tree v
|
17 | add :: Ord v => v -> Tree v -> Maybe Tree v
| ^^^^^^^^^^^^
functor1.hs:17:40: error:
* Expecting one more argument to `Tree'
Expected a type, but `Tree' has kind `* -> *'
* In the first argument of `Maybe', namely `Tree'
In the type signature:
add :: Ord v => v -> Tree v -> Maybe Tree v
|
17 | add :: Ord v => v -> Tree v -> Maybe Tree v
| ^^^^
Failed, no modules loaded.
语法有错误吗?请帮忙
【问题讨论】:
-
不,它更符合语义。你写
(val + v) ++ add v left ++ add v right,但(val + v) ++ add v left ++ add v right是Maybe Tree怎么样?此外,您应该写Maybe (Tree v),并且v也应该是Num的一个实例。 -
此外,您的问题定义了一个函数
add,但错误是关于fmap1。 -
你缺少括号:
add :: Ord v => v -> Tree v -> Maybe (Tree v)
标签: haskell recursion functional-programming