这可能是一个愚蠢的问题,当然不是最好的代码,但我不太明白为什么如果我添加一些打字信息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
答案 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
子句中不可见;它将是一个独立的类型标识符,因此毫无意义。