2015-01-09 14 views
6

私は彼が次の関数を定義する特徴バルトシュMilewskiによって作品を読んでいる:

instance Applicative Chan where 
    pure x = Chan (repeat x) 
    (Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs) 

なぜ括弧内の関数適用演算子はありますか?私はこれが接頭辞表記形式で中置関数を使用するために通常行われると理解していますが、なぜこの場合、関数は単にChan (zipWith $ fs xs)として表現できず、何の違いがあるのか​​理解できません2つはです。

(あなたはまだarticleを参照し、コンテキストを必要とする場合)

+1

ように見えたかもしれませんか?現在の実装とまったく同じです。 – Carl

+0

'($)'はいくつかの魔法の基本演算子ではなく、 '(+)'や 'or'のような関数です。 – AJFarmar

答えて

13

この場合、$zipWithからに渡されています。それは括弧なしで

zipWith (\ f x -> f x) fs xs 

を書くのと同じです、それはです。TypeCheckするつもりはない

zipWith (fs xs) 

と同等であったであろう。

カッコ内の演算子は、通常の識別子とまったく同じように動作します。次のように定義された:それは `チャン(zipWith番号のFSはxs)と書かれていた場合、それは任意の単純だろう

apply = ($) 

コードは`

zipWith apply fs xs 
+2

具体的には、haskellの文法では、 'zipWith 'と言う必要があります。ここで ''は式です。 '($)'は*式*に変換された中置演算子 '$'です。これは接頭辞に変換されたものと少し異なり、接頭辞関数としての使用と他の関数への引数としての使用が可能です。 –

関連する問題