2012-05-07 9 views
10

私はHaskellので遊んでたように私はTrueを生み出す

($ 4) (> 3) 

ような何かを行うことが可能であることを今日気づきました。ここで何が起こっているのですか?いくつかの直感を持つことは素晴らしいことです。

私の推測ですか? ($ 4)が不完全な関数アプリケーションだと思われますが、私が混乱しているのは、$が中置演算子なので、(4 $)のようにはなりませんか?これはコンパイルされないので、明らかにそうではありません。これは、私が実際に何が起こっているのか分かりません。 (\x -> x 4) (>3)のようなものを提供すれば、結果は同じになるので、(>3)という言葉は私には意味があります。

+1

答えは優れていますが、 '(\ x op \' e) 'と'(e \ ') '\' op \ 'は演算子(通常の' + '、' 'など)であるか、またはバッククック)。 – Vitus

+2

'(f $)'を "_call the_関数f"と読みます。 '($ 4)'を "_call with_4を引数として"読みます。 "4で電話する" "は3よりも大きいですか?" 「4は3を超えていますか?」です。 '($ 4)(> 3)==(> 3)4 == 4> 3 ==(4>)3'である。 –

答えて

19

($ 4)は、sectionと呼ばれています。部分的に中置演算子を適用する方法ですが、左辺ではなく右辺を指定します。それはまさに(flip ($) 4)に相当します。

同様に、(> 3)はセクションです。

($ 4) (> 3) 

(> 3) $ 4 

と同じであり、この時点で、それがあるべき

flip ($) 4 (> 3) 

同じである

(flip ($) 4) (> 3) 

のように書き換えることができます。これがに沸騰することを明らかにする。

+0

ああ、それはとても冷たいです。どうもありがとう。 – apc

+5

@apc:部分的なアプリケーションにあまり慣れていない場合は、 'add :: Int - > Int 'という型シグニチャを' add :: Int - >(Int-> int)」、つまり「addはIntをとり、Int-> Int」関数を返す関数です。またgoogle「currying haskell」 – jberryman

+0

ありがとう@jberryman。私は実際にそれを知っていましたが、 :)他の人のためにも言いました:) – apc

12

どちらの側からも部分演算子演算子を部分的に適用できます。 +などの可換性演算子の場合は、(+ 1)または(1 +)と言っても問題ありませんが、除算の場合は、被除数(5 /)または除数(/ 5)のいずれかを指定できます。

関数アプリケーション演算子は、左オペランドとしての関数と右オペランド(f $ x)としてのパラメータを取ります。したがって、関数(f $)またはパラメータ($ x)で部分的に適用できます。だから、

($ 4) (> 3) 

与えられた最初の一部のパラメータ4で$演算子はを適用し、機能(> 3)でそれを提供します。これが本質的になるのは

(> 3) $ 4 

(4 > 3)と同じです。

6

($ 4)は、関数をとり、4を適用する関数です。

(> 3)は、数値をとり、3より大きいかどうかを調べる関数です。

前者に後者の機能を与えると、入力が3より大きいかどうかをチェックする関数に本質的に4が適用され、したがってTrueが得られます。

関連する問題