2016-07-23 5 views
0

私はhaskellの($)についてかなり混乱しています。

私はGHCiの中

:t ($) 

を入力します。私はそう

($ 3) :: Num a => (a -> b) -> b 

を取得します

:t ($ 3) 

を入力すると、その理由($)エラーなしで二番目の引数を受け入れ、

:($) :: (a -> b) -> a -> b 

を取得しますが?

+1

'($)'関数は実際には普通のHaskell関数ですが、完全に記号的なすべての関数と同様に、中置演算子です。中置演算子には、*演算子セクション*と呼ばれる特別な部分的なアプリケーション構文があります。その詳細については、http://wiki.haskell.org/Section_of_an_infix_operator –

+0

@Alexis King、[あまり一般的ではありません](http:// www。 mail-archive.com/[email protected]/msg18923.html)。 – user3237465

+1

@ user3237465私はそれを実際に認識していますが、それを学習者に伝えることは、まったく不必要な混乱を引き起こすだけです。 –

答えて

8

よく($)は演算子であり、中置関数です。それは定義は(実際にはそれが面白くする唯一のものは、その固定性ある、と私はGoogleがその上のリソースのトンを持っていると確信している)非常に簡単ですです:

($) :: (a -> b) -> a -> b 
f $ x = f x 

すべての演算子と同じように、あなたはsectionsを取ることができます第1引数または第2引数だけを適用することによって、これはさらに(+)オペレータでより明白であるかもしれない:

(+ 2) -- equivalent to \x -> x + 2 
(2 +) -- equivalent to \x -> 2 + x 

同じことが($ 3)のために保持している - それは\f -> f $ 3と同等です。この関数の型はかなり明白でなければなりません:その引数fはそれ自身で数値をとり、何か他のもの(f :: Num a => a -> b)を返す関数でなければならず、関数全体はfが返すものと同じ型を返します。その結果、

(\f -> f $ 3) :: Num a => (a -> b) -> b 

したがって、($ 3) :: Num a => (a -> b) -> bとなります。

+0

(3 $)ならば、どうなるでしょうか?私は結果が出ないと思う。 map(3 $)[\ x-> x + 10]で使用します。 – MD05

+1

'(3 $)'は型チェックされません。 '$'は最初の引数が関数であると想定します。 – Alec