Haskell 类型定义错误

标签 haskell

我刚刚开始学习 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/

相关文章:

haskell - Haskell 中的无限列表

haskell - 如何导入模块进行测试?

list - 给定一个字符串,获取元组列表(字符,字符连续出现多少次)-Haskell

haskell - 这个函数会产生什么

haskell - 非纯函数破坏可组合性是什么意思?

haskell - 如何组合 case 语句模式

haskell - Haskell 中不错的小型简单现实生活编程示例?

haskell - 如何使用IM布局在xmonad中设置名册高度

Haskell Beam 代码仅适用于一个模块

c - 为什么一个配合函数可以更快地收敛到解决方案?