gpt4 book ai didi

haskell - foldr groupBy 实现的类型错误

转载 作者:行者123 更新时间:2023-12-01 11:39:33 25 4
gpt4 key购买 nike

我坚持使用 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”使其无法编译并吐出此错误,但是当我将 f x y 替换为 True 或 False 时,它​​会编译。我想知道如何在“f x y”为真时返回 []:(y:ys)。

最佳答案

好吧,简而言之,第一个版本 y 是类型 [a],因为它不受 f 类型签名的约束,然后将 y 绑定(bind)为 a 类型。

请注意 step(y:ys)[[a]] 类型,所以您真的想要类似的东西

step x ((y:ys):yss) | f x y = (x:y:ys):yss
step x ys = [x]:ys

关于haskell - foldr groupBy 实现的类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com