(->)
は、多くの場合、「機能の矢」や「関数型コンストラクタ」と呼ばれ、それはいくつかの特別な構文を持っていながら、それについてずっと特別なことはありませんされています。
これは本質的にインフィックスタイプの演算子です。 2つの型を与え、それらの型の間の関数の型を与えます。ちょうど2 + 3
が(+) 2 3
のための構文的な砂糖のように、のためのfrom -> to
構文的な砂糖はそうです。記号が混乱している場合はFunction from to
のように考えることができます。言い換えれば
、あなたが言及したインスタンスは、それを明確に私たちはいくつかの任意の(しかし固定)型の引数を取る関数について話していることになります
instance Monad (Function from) where ...
として読み取ることができます。実際、このモナドのインスタンスはControl.Monad.Instancesにあり、それは本質的にthe Reader monadと同じです。
the sourceを見ると、それは実際にはかなり簡単です:return
で与え
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
些細な値は、引数を無視し、(>>=)
オペレータは、両側に引数r
を配布しています。
これは関数の対応Applicative
例において、pure
と(<*>)
はthe SKI combinator calculusのK及びSコンビネータに対応することに注目することも興味深いです。
(->)
もArrow type classで一般化されています。矢印の紹介can be found here
最後に、シンボル->
は、ラムダ抽象度\x -> ...
、ケース式case ... of x -> ...
など、多かれ少なかれ無関係な構文の部分にも現れます。逆の記号<-
もいくつかの無関係なコンテキストで発生します。それらを機能の矢印と混同しないでください。
注:インスタンスMonad(( - >)r)である必要があります。 '( - >)'は2つの型引数を取ります。一方、 'Monad'は1つしかない型のため、部分的に最初にそれを適用する必要があります。 – hammar