我刚刚开始学习 Haskell,我的作业是使用高阶函数来创建具有以下类型定义的函数
-- compr :: (a->b) -> (a -> Bool) -> [a] -> [b]
函数不相关,可以是最简单的函数所以我的想法是这样的:
identity x = x
booleans x | x == 1 = True
| x ==0 = False
| otherwise = False
compr identity booleans xs = filter booleans(map (identity) xs)
但是这个函数有这种类型
compr :: (a->b) -> (b -> Bool) -> [a] -> [b]
我已经尝试了一切,但没有任何积极的结果。我希望你能帮助我。
最佳答案
你差不多明白了,但你需要在 map 之前应用过滤器。这样,过滤器适用于 [a]
而不是 [b]
,并且谓词获得正确的类型。
> compr identity booleans xs = map identity (filter booleans xs)
> :t compr
compr :: (a -> b) -> (a -> Bool) -> [a] -> [b]
顺便说一句,我发现您为变量使用的名称具有误导性。例如,compr
定义中的 identity
变量与您之前声明的 identity
函数无关。
我建议您使用更通用的变量名称,例如
> compr f p xs = map f (filter p xs)
其中 f
代表“函数”,p
代表谓词。
关于Haskell 类型定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43923515/