在Haskell中键入注释

时间:2013-09-20 14:03:09

标签: haskell types

这可能是一个愚蠢的问题,当然不是最好的代码,但我不太明白为什么如果我添加一些打字信息haskell对我大吼大叫

这不起作用(注意x:第3行):

groupBy3 :: (a -> a -> Bool)-> [a] -> [[a]]
groupBy3 eq = foldr step []
    where step (x:a) res =
            let (used, res2) = foldr insertel (False, []) res
                    where insertel (al) (used, acc) =
                            if used then (True, al:acc)
                            else if eq x (head al) then
                                (True, (x:al):acc)
                            else
                                (False, al:acc)
            in
              if used then
                  res2
              else [x]:res

虽然这有效(注意第3行的x缺少类型注释)

groupBy3 :: (a -> a -> Bool)-> [a] -> [[a]]
groupBy3 eq = foldr step []
    where step x res =
            let (used, res2) = foldr insertel (False, []) res
                    where insertel (al) (used, acc) =
                            if used then (True, al:acc)
                            else if eq x (head al) then
                                (True, (x:al):acc)
                            else
                                (False, al:acc)
            in
              if used then
                  res2
              else [x]:res

2 个答案:

答案 0 :(得分:6)

添加Sebastian Redl的回答: 您不能在标准Haskell的函数体中引用顶级定义中的类型变量。但是,有一个名为“Scoped type variables”的GHC扩展允许您这样做(参见http://www.haskell.org/haskellwiki/Scoped_type_variables

答案 1 :(得分:5)

(x:a)没有输入信息,它是列表构造函数的模式匹配,将列表的头部放入x,其余部分放入a

键入信息使用::,无论如何都没有意义,因为来自main函数类型的a的占位符在where子句中不可见;它将是一个独立的类型标识符,因此毫无意义。