haskell - 对对进行操作的映射函数
问题描述
我正在尝试编写一个类似于 的函数map
,但它将类型函数(a, a) -> b
作为其第一个参数。但是,我得到了错误
<interactive>:474:11: error:
Parse error in pattern: \ (x, y) -> f x y
使用以下代码:
Prelude> :{
Prelude| mappairs :: ((a, a) -> b) -> [a] -> [b]
Prelude| mappairs (\(x,y) -> f x y) xs = foldr (\(x, y) acc -> (f x y : acc)) [] xs
Prelude| :}
问题是什么?
解决方案
图案:
\(x,y) -> f x y
在条款中:
mappairs (\(x,y) -> f x y) xs = foldr (\(x, y) acc -> (f x y : acc)) [] xs
确实无效,因为(->)
它不是数据构造函数。
但是,您可以zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
在此处使用:
mappairs :: ((a, a) -> b) -> [a] -> [b]
mappairs _ [] = []
mappairs f xa@(_:xs) = zipWith (curry f) xa xs
例如:
> mappairs (\(x,y) -> x+y) [1,4,2,5]
[5,6,7]
但是省略元组看起来更像“ Haskell-ish ”,因此直接使用函数:
mappairs :: (a -> a -> b) -> [a] -> [b]
mappairs _ [] = []
mappairs f xa@(_:xs) = zipWith f xa xs
推荐阅读
- python-3.x - WinError2 不断弹出这个 python 3.7.3 脚本来删除文件树中的文件,而无需滚动它们
- php - 如果已达到限制,请选择下一个可用日期(PHP 和 MySQL)
- javascript - javascript如果表单值a大于表单值b不起作用
- postgresql - 通过云sql代理连接postgres cloud sql
- c++ - 使用 CMake 构建 project.sln 时发布构建事件错误
- java - 是否可以(如何)使用 spring 数据在同一个项目中使用不同的 ojdbc 驱动程序?
- javascript - 使用 json 从特定键中检索每个值
- java - Java 工具公证流程
- javascript - React-native 搜索栏 - 错误:未定义不是函数('... this.state.books.filter...' 附近)
- reactjs - 间距不适用于卡片网格。包括沙盒