私はhaskellの($)についてかなり混乱しています。
私はGHCiの中
:t ($)
を入力します。私はそう
($ 3) :: Num a => (a -> b) -> b
を取得します
:t ($ 3)
を入力すると、その理由($)エラーなしで二番目の引数を受け入れ、
:($) :: (a -> b) -> a -> b
を取得しますが?
私はhaskellの($)についてかなり混乱しています。
私はGHCiの中
:t ($)
を入力します。私はそう
($ 3) :: Num a => (a -> b) -> b
を取得します
:t ($ 3)
を入力すると、その理由($)エラーなしで二番目の引数を受け入れ、
:($) :: (a -> b) -> a -> b
を取得しますが?
よく($)
は演算子であり、中置関数です。それは定義は(実際にはそれが面白くする唯一のものは、その固定性ある、と私は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
となります。
'($)'関数は実際には普通のHaskell関数ですが、完全に記号的なすべての関数と同様に、中置演算子です。中置演算子には、*演算子セクション*と呼ばれる特別な部分的なアプリケーション構文があります。その詳細については、http://wiki.haskell.org/Section_of_an_infix_operator –
@Alexis King、[あまり一般的ではありません](http:// www。 mail-archive.com/[email protected]/msg18923.html)。 – user3237465
@ user3237465私はそれを実際に認識していますが、それを学習者に伝えることは、まったく不必要な混乱を引き起こすだけです。 –