haskell - 如何用高阶函数表达列表理解?
问题描述
这个程序的目的是使用一个高阶函数来表示一个列表推导,它需要一个函数(a -> b)
和过滤器 p:(a -> Bool)
和一个 list:[Int]
来生成一个列表。但是,会出现一系列错误:
- 无法将预期类型
Bool -> [Int]
与实际类型匹配[b0]
- 该函数
map
应用于三个参数,但它的类型(a1 -> b0) -> [a1] -> [b0]
只有两个。listcomprehension f p xs = map f filter(p xs)
- 无法将预期类型
a1 -> b0
与实际类型匹配(a, b)
- 无法将预期类型
[a1]
与实际类型匹配(a0 -> Bool) -> [a0] -> [a0]
。
listcomprehension :: (a -> b) -> (a -> Bool) -> [Int] -> [Int]
listcomprehension f p xs = map f filter(p xs)
我尝试了一种不同的方法,我在其中写道:
listcomprehension :: (a -> b) -> [Int] -> [Int]
listcomprehension f xs = map f filter(p xs)
第二种解决方案的错误是 p 不在范围内。这导致了是否添加 p 作为导致错误的任何一种方式的两难选择,问题是如何将 p 作为参数包含在函数中?
解决方案
它需要一个功能
(a,b)
。
(a, b)
不是函数。(a, b)
是一个 2 元组,对于一个函数,您需要将其重写为a -> b
.
由于您仅使用Int
s 列表,因此您不能将a -> b
其用作映射函数,也不能a -> Bool
用作过滤函数。这些功能应该f :: Int -> Int
和p :: Int -> Bool
您还以错误的方式使用括号。为了让这项工作,它应该是:
listcomprehension :: (Int -> Int) -> (Int -> Bool) -> [Int] -> [Int]
listcomprehension f xs = map f (filter p xs)
或者我们可以将此函数进一步推广到:
listcomprehension :: (a -> b) -> (a -> Bool) -> [a] -> [b]
listcomprehension f xs = map f (filter p xs)
然而,上面不是列表理解表达式。您可以使用以下方法实现这样的列表理解表达式:
listcomprehension :: (a -> b) -> (a -> Bool) -> [a] -> [b]
listcomprehension f xs = [f x | x <- xs, p x]
推荐阅读
- powershell - 尝试删除特定文件并记录删除
- django - 创建超级用户时,它将电子邮件放在用户名中,反之亦然
- python - 如果第一张图片为空,如何使 plt.canvas.draw() 更新工作?
- javascript - Angularjs 的动态条件工具提示
- javascript - 如何通过单个操作删除每个 Reducer 中的状态
- asp.net-core - 具有新的多语言映射的投影或自定义值解析器
- android - 在消耗性列表视图中,在组for循环下的全局数组列表中设置数据,当进入适配器时,它只显示最后一个值?
- javascript - Nodejs - res.render/send 不适用于带有等待的异步功能
- c# - 在不使用计时器的情况下创建 Windows 服务
- sql - Sql Link 3 表,但仍显示其中 1 个表的唯一性