2012-02-03 9 views
21

私はhaskellの->演算子について詳しく知りたいと思います。私は、特別な構文とある種の種類のクラスの間の線がどれくらいぼやけているかについてはっきりしていないので、いくつかのことをしたいと思います。 Specificalyl、私はこのようなものを見た:haskell " - >"演算子はどこで読むことができますか?

instance Monad ((->) r) where ... 

これは私の関心を呼んだ。

しかし、 "haskell arrow"や "haskell function"や "haskell class function"を検索しようとすると、Control.Arrowや単純なタイプのクラスチュートリアルの結果を得るのに明らかな問題が発生します。

->とは何ですか、どこで詳細を読むことができますか?

+2

注:インスタンスMonad(( - >)r)である必要があります。 '( - >)'は2つの型引数を取ります。一方、 'Monad'は1つしかない型のため、部分的に最初にそれを適用する必要があります。 – hammar

答えて

27

(->)は、多くの場合、「機能の矢」や「関数型コンストラクタ」と呼ばれ、それはいくつかの特別な構文を持っていながら、それについてずっと特別なことはありませんされています。

これは本質的にインフィックスタイプの演算子です。 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 -> ...など、多かれ少なかれ無関係な構文の部分にも現れます。逆の記号<-もいくつかの無関係なコンテキストで発生します。それらを機能の矢印と混同しないでください。

+1

いつものように大きな答えです。しかし、ラムダ式の - >は、考えられるよりも型演算子に関連していると主張することができます。もちろん、 '(\ a - > b)c'は' a - > b'のcase cであり、その逆でもあります。 – Ingo

0

は、矢印と呼ばれるだと思います。 「Real World Haskell」によると:

を - >一つだけの意味があります。それは左の型の引数を取り、右の型の値を返す関数です。

+1

これは型シグネチャですが、OPは関数について話しています – amindfv

関連する問題