函数在Haskell中的应用

函数在Haskell中的应用,haskell,higher-order-functions,Haskell,Higher Order Functions,假设我有一个函数列表 functions = [f, g, h] 每个带有a->a 我也有一个值列表,比如说数字,但这里的任何东西都应该起作用 vals = [1,2,3] 我想将functions中的每个函数应用于vals 我的第一反应是使用lambda和zipWith,比如: zipWith (\f v -> f v) functions vals 但坦率地说,这看起来很难看,而且在哈斯凯尔这样的好语言中,这不是我所期望的。函数应用程序函数听起来像是解决方案。有这样的事吗?我是否

假设我有一个函数列表

functions = [f, g, h]
每个带有
a->a

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

vals = [1,2,3]
我想将
functions
中的每个函数应用于
vals

我的第一反应是使用lambda和zipWith,比如:

zipWith (\f v -> f v) functions vals
但坦率地说,这看起来很难看,而且在哈斯凯尔这样的好语言中,这不是我所期望的。函数应用程序函数听起来像是解决方案。有这样的事吗?我是否遗漏了什么,并且有更好的解决方案?实际上,我最终为一个项目Euler解决方案编写了这个结构。这很有效,但我不喜欢

zipWith ($) f v
$
是函数应用程序。它的优先级特别低,这一事实有时会让人感到困惑。

奇怪的是

zipWith id functions vals
这也行


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

这里有另一个可能会让你思考一下的选项

>>> import Control.Applicative
>>> let functions = ZipList [(+1), (*2), (*10)]
>>> let values    = ZipList [1, 2, 3]
>>> getZipList (functions <*> values)
[2, 4, 30]
>导入控制。应用程序
>>>let函数=ZipList[(+1),(*2),(*10)]
>>>let values=ZipList[1,2,3]
>>>getZipList(函数值)
[2, 4, 30]
ZipList
只是列表的包装器。
对于
ZipList
的定义是“通过将每个函数依次应用于参数,将函数列表(左侧)与参数列表(右侧)压缩”


这与常规列表中的
的定义相反,后者说“从这两个列表中选取每一对(函数、参数)并将函数应用于参数”。

@JuanPablo因为
$
实际上只是
id
,专门处理函数(并且给出了一个非常低的优先级和中缀符号)。
$
的类型,假设它将一个函数应用于一个参数,必须是
(a->b)->a->b
。记住所有Haskell函数都是“真的”一元函数(或者相当于
->
关联到右边),与
(a->b)->(a->b)的类型相同
。这意味着它接受任何类型的函数并为您提供相同类型的函数;只是
id::a->a
的一个特例,它接受任何类型的值并为您提供相同类型的值。另一种方法是:使用
zipWith id
意味着每个结果元素都由
id f v
计算ode>IDFequals
f
so
IDFv
equals
Fv