2

これは、一連の関数を同じ変数に適用したい状況で発生します。次のようになります。

map (\f->f 4) [odd, even]

しかし、LYAHを使用$して非常にきれいにします

map ($ 4) [odd, even]

なぜそれが機能するのですか。最初に ghci のよう$ 4 oddに入力すると失敗し、次に と入力すると正常($ 4) oddに動作します。次に、を示す($ 4)usingのタイプを確認します。それは理にかなっているように思えますが、それでも私には明確ではありません。:t($ 4) :: Num a => (a -> b) -> boddodd :: Integral a => a -> Bool

誰かがそれを明確に説明できますか、それは の別の一般的な使用法ですか? の$他の使用法はあり$ますか?

4

3 に答える 3

3

*++、またはなどの中置演算子は、$通常、次のように 2 つの引数を取ります。

x ++ y

1 つの引数が欠落しており、それらが括弧で囲まれている場合、代わりにsectionを形成します:

(x ++)
(++ y)

これらのセクションは、それぞれ、

\y -> x ++ y
\x -> x ++ y

つまり、「欠落している引数」を結果にマップする関数を表します。例えば、

map ("A"++) ["a","b"] == [ "Aa","Ab" ]
map (++"A") ["a","b"] == [ "aA","bA" ]

オペレーター$は、この点で特別ではありません。我々は持っています

(f $)
($ x)

これは

\x -> f $ x
\f -> f $ x

最初のものは (eta-) が (*) と同等である(f $)ため、あまり役に立ちません。2 番目は代わりに便利です。\x -> f $ xf

(*) うるさいと言うと、 とseqを区別できますが、これは実際には小さな違いです。undefined(undefined $)

于 2014-08-25T15:17:24.037 に答える
3
  1. $ 4 odd: 演算子を中置形式で使用しない場合は括弧で囲む必要があるため、これは機能しません。を行う場合($) 4 odd、引数の順序が正しくないため、これは機能しません。2 番目の引数になりたい4と考えています。でも書くことができ($) odd 4ます。

  2. ($ 4) odd:演算子セクションを使用しているため、これは機能します。ここで4は、 の 2 番目の引数として が提供され$ます。(++ "world") "hello "と同じようなもの"hello " ++ "world"です。

  3. ($ 4) :: Num a => (a -> b) -> b、 、 がある場合はodd :: Integral a => a -> Bool、型を並べるだけです。everyIntegral aも であるため、 to をNum a「アップグレード」(制約) して、これを機能させることができNumますIntegral

($ 4) :: Integral a => (a ->    b) -> b
odd   :: Integral a =>  a -> Bool

だからa ~ ab ~ Boolだからあなたはそれを言うことができます

($ 4) :: Integral a => (a -> Bool) -> Bool

したがって、それを適用するとodd

($ 4) odd :: Bool

($ 4) oddと同じだからですodd $ 4。の定義を見る$

f $ x = f x

私たちはそれを言うことができます

odd $ 4 = odd 4

に評価されFalseます。

于 2014-08-25T15:17:17.847 に答える