7

関数のリストがあるとしましょう

functions = [f, g, h]

それぞれタイプありa -> a

数値などの値のリストもありますが、ここでは何でも機能するはずです

vals = [1,2,3]

functions各関数を対応する値に適用したいvals

私の最初の本能は、ラムダと zipWith を次のように使用することです。

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

しかし、率直に言って、これは見た目が悪く、Haskell のような優れた言語では期待できないものです。関数適用関数は解決策のように聞こえます。そのようなことはありますか?私は何かを見逃していますか?私の問題に対するより良い解決策はありますか?私は実際に、Project Euler ソリューション用にこの構造を作成することになりました。それは機能しますが、私はそれが好きではありません。

4

3 に答える 3

16
zipWith ($) f v

$関数適用です。優先順位が特に低いという事実は、人々をループに陥らせることがあります。

于 2013-07-31T03:35:25.920 に答える
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「各関数を順番に引数に適用することにより、関数のリスト (左側) を引数のリスト (右側) で圧縮する」と述べています。

<*>これは、 「これら 2 つのリストから (関数、引数) のすべての可能なペアを取得し、その関数を引数に適用する」という通常のリストの for の定義とは対照的です。

于 2013-07-31T08:12:03.107 に答える