3

Haskellで行っている計算の一部は、にマップFloatされる関数のリストになりFloatます。次のように、これらすべての関数に1つの引数を適用したいと思います。

-- x :: Float
-- functions :: [Float -> Float]
map (\f -> f x) functions

使い捨てラムダ関数を使用せずにこれを行う方法はありますか?私はHoogleを検索して、署名が()であると思うものを探しました[a -> b] -> a -> [b]が、運がありませんでした。

4

2 に答える 2

9

$関数アプリケーションである演算子を使用できます。

map ($ x) functions

(これは、それが式の範囲内にあることを前提としてxいます。)

Hoogleは関数のみを検索でき、任意の式は検索できません。を使用しているので、リストに関連するものではなく、mapのような関数を検索したいと考えました。(a -> b) -> a -> b通常の関数が与えられた場合、それをに渡すと、mapリストに作用します。

于 2012-10-30T08:05:07.720 に答える
6

functions <*> pure xそれをする必要があります。Control.Applicative最初にモジュールをインポートします。

これも考慮してください:

Prelude Control.Applicative> [(1+),(2+)] <*> pure 4
[5,6]
Prelude Control.Applicative> [(1+),(2+)] <*> [4]
[5,6]
Prelude Control.Applicative> [(1+),(2+)] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> [(+)] <*> [1,2] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> (+) <$> [1,2] <*> [4,5]
[5,6,6,7]
Prelude Control.Applicative> getZipList $ ZipList [(1+),(2+)] <*> ZipList [4,5]
[5,7]
Prelude Control.Applicative> getZipList $ ZipList [(1+),(2+)] <*> pure 4
[5,6]

<$>はの同義語ですfmap<*>特定のセマンティクスに従って、左側のアプリケーションファンクターで「運ばれる」ものを右側に適用します。ネイキッドリストの場合、セマンティクスはリストモナドと同じです-すべての可能な組み合わせを作成します-左から各関数を右の各オブジェクトに適用しますpure x = [x]。sとしてタグ付けされた(つまりnewtyped)リストZipListの場合、セマンティクスは「zippery」アプリケーションです。つまり、1対1、およびpure x = ZipList $ repeat xです。

于 2012-10-30T08:15:44.250 に答える