首页 > 解决方案 > 对对进行操作的映射函数

问题描述

我正在尝试编写一个类似于 的函数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| :}

问题是什么?

标签: haskell

解决方案


图案:

\(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

推荐阅读