7

假设我有一个函数列表

functions = [f, g, h]

每个都有类型a -> a

我也有一个值列表,比如数字,但任何东西都应该在这里工作

vals = [1,2,3]

我想将每个函数应用functions到相应的值vals

我的第一直觉是使用 lambda 和 zipWith ,例如:

zipWith (\f v -> f v) functions vals

但坦率地说,这看起来很丑陋,在 Haskell 这样的好语言中我并不期待。功能应用功能听起来像是解决方案。有这样的事吗?我是否遗漏了什么,并且有更好的解决方案来解决我的问题?实际上,我最终为 Project Euler 解决方案编写了这个构造。它有效,但我不喜欢它。

4

3 回答 3

16
zipWith ($) f v

$是功能应用。它具有特别低的优先级这一事实有时会让人陷入循环。

于 2013-07-31T03:35:25.920 回答
11

奇怪的是,

zipWith id functions vals

也会工作!

但是,真的,zipWith ($)这是写这个的正确方法。

于 2013-07-31T03:41:08.320 回答
3

这是另一个可能会让您思考的选项。

>>> import Control.Applicative
>>> let functions = ZipList [(+1), (*2), (*10)]
>>> let values    = ZipList [1, 2, 3]
>>> getZipList (functions <*> values)
[2, 4, 30]

AZipList只是列表的包装器。<*>for a的定义ZipList说“通过依次将每个函数应用于参数来压缩函数列表(左侧)和参数列表(右侧)”。

这与常规列表的定义形成对比,<*>常规列表的定义是“从这两个列表中获取每一对可能的(函数,参数)并将函数应用于参数”。

于 2013-07-31T08:12:03.107 回答