我坚持用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"是的。
答案 0 :(得分:5)
嗯,简而言之,第一个版本y
的类型为[a]
,因为它不受f
类型签名的约束,而第二个版本y
绑定属于a
类型。
请注意(y:ys)
的{{1}}类型为step
,所以你真的需要像
[[a]]