这可能是一个愚蠢的问题,当然不是最好的代码,但我不太明白为什么如果我添加一些打字信息,haskell 会对我大喊大叫
这不起作用(注意 x:a 第 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