在Haskell CIS194周第2周使用匿名功能练习2



我试图通过" 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)

但是,使用模式匹配比使用headtail

更好地编写。
build (x:xs) = reduce insert xs (Node Leaf x Leaf)

最新更新