我试图通过" CIS 194:Haskell 2013介绍"课程学习Haskell,并在第二周遇到了练习2的障碍。我正在尝试使用辅助递归函数来定义我的构建功能
reduce :: (a -> b -> b) -> [a] -> b -> b
reduce _ [] x = x
reduce f (x:xs) y = reduce f xs (f x y)
此功能的目标是将列表上的函数递归应用于b。这是因为我想递归将logmessage的列表插入Messagetree
build :: [LogMessage] -> MessageTree
build [] = Node Leaf (Unknown "") Leaf
build messages =
reduce (x y -> (insert x y)) tail(messages) (Node Leaf head(messages) Leaf)
但是,当我尝试编译时,我会收到一长串的编译错误:
LogAnalysis.hs:42:22:
Couldn't match expected type `t0 -> MessageTree'
with actual type `MessageTree'
In the return type of a call of `insert'
Probable cause: `insert' is applied to too many arguments
In the expression: (insert x y)
In the first argument of `reduce', namely `( x y -> (insert x y))'
LogAnalysis.hs:42:31:
Couldn't match expected type `MessageTree'
with actual type `t0 -> MessageTree'
In the second argument of `insert', namely `y'
In the expression: (insert x y)
In the first argument of `reduce', namely `( x y -> (insert x y))'
LogAnalysis.hs:42:35:
Couldn't match expected type `[LogMessage]'
with actual type `[a0] -> [a0]'
In the second argument of `reduce', namely `tail'
In the expression:
reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
In an equation for `build':
build messages
= reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
LogAnalysis.hs:42:40:
Couldn't match expected type `t0 -> MessageTree'
with actual type `[LogMessage]'
In the third argument of `reduce', namely `(messages)'
In the expression:
reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
In an equation for `build':
build messages
= reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
LogAnalysis.hs:42:51:
Couldn't match expected type `MessageTree -> t0'
with actual type `MessageTree'
The function `Node' is applied to four arguments,
but its type `MessageTree
-> LogMessage -> MessageTree -> MessageTree'
has only three
In the fourth argument of `reduce', namely
`(Node Leaf head (messages) Leaf)'
In the expression:
reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
LogAnalysis.hs:42:61:
Couldn't match expected type `LogMessage'
with actual type `[a1] -> a1'
In the second argument of `Node', namely `head'
In the fourth argument of `reduce', namely
`(Node Leaf head (messages) Leaf)'
In the expression:
reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
LogAnalysis.hs:42:66:
Couldn't match expected type `MessageTree'
with actual type `[LogMessage]'
In the third argument of `Node', namely `(messages)'
In the fourth argument of `reduce', namely
`(Node Leaf head (messages) Leaf)'
In the expression:
reduce
( x y -> (insert x y))
tail
(messages)
(Node Leaf head (messages) Leaf)
Failed, modules loaded: Log.
供参考,这是我的插入功能,它正确编译了
insert :: LogMessage -> MessageTree -> MessageTree
insert (Unknown _) tree = tree
insert _ tree@(Node _ (Unknown _) _) = tree
insert message Leaf = Node Leaf message Leaf
insert message@(LogMessage _ timeStampMessage _) (Node left m@(LogMessage _ timeStampTree _) right)
| timeStampMessage < timeStampTree = Node (insert message left) m right
| timeStampMessage > timeStampTree = Node left m (insert message right)
| timeStampMessage == timeStampTree = Node left message right
括号不表示函数调用;它们只是影响操作员的优先级。功能应用由并置表示(可以将其视为具有最高优先级的操作员)。
这条线
build messages = reduce (x y -> (insert x y)) tail(messages) (Node Leaf head(messages) Leaf)
应首先缩短为
build messages = reduce insert tail(messages) (Node Leaf head(messages) Leaf)
这使得更容易看到括号的正确方法:
build messages = reduce insert (tail messages) (Node Leaf (head messages) Leaf)
但是,使用模式匹配比使用head
和tail
:
build (x:xs) = reduce insert xs (Node Leaf x Leaf)