函数在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
和f
soIDFv
equalsFv
。