使用foldr groupBy实现输入错误

时间:2014-04-03 10:30:00

标签: haskell fold

我坚持用foldr实现groupBy。由于某些原因,当我改变一个保护条件时,类型签名就会对我产生影响。

我可以编译它,虽然它不正确:

groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]

groupBy' f xs = foldr step [] xs
    where    step x [] = [x] : []
             step x (y:ys)
                 | True = []:(y:ys)
                 | otherwise = (x:y):ys

但是这不能编译:

groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]

groupBy' f xs = foldr step [] xs
    where    step x [] = [x] : []
             step x (y:ys)
                 | f x y = []:(y:ys)
                 | otherwise = (x:y):ys

给我这个错误。

Couldn't match type `a' with `[a]'
  `a' is an unknown type variable
Expected type: [[a]]
  Actual type: [a]
In the second argument of `(:)', namely `ys'
In the expression: (x : y) : ys
In an equation for `step':
    step x (y : ys)
      | f x y = [] : (y : ys)
      | otherwise = (x : y) : ys

我不明白。使用" f x y"使它不编译并吐出这个错误,但是当我用True或False替换f x y时,它会编译。我想知道如何回复[] :( y:ys)当" f x y"是的。

1 个答案:

答案 0 :(得分:5)

嗯,简而言之,第一个版本y的类型为[a],因为它不受f类型签名的约束,而第二个版本y绑定属于a类型。

请注意(y:ys)的{​​{1}}类型为step,所以你真的需要像

这样的东西
[[a]]