2016-12-20 35 views
1

私は次のコード<*>の機能はどのように機能しますか?

(,) <$> (+1) <*> (+1) 

の関数の結果は、テンキー、A => A型を持つ理由はラムダ計算で把握しようとしています - >(a)の代わりのNum aの=> A - > A - >(a、a)

これは私が持っているものですが、私はひどく間違ったことをしていますか?< *>この方法で接続しましたか?

(\x, y -> (,) x y) <$> (\x -> x + 1) <*> (\x -> x + 1) 

-- fmap applies first 

(\x y -> (,) ((+1) x) y) <*> (\x -> x + 1) -- substituted the lambda with (+1) for better clarity 

-- then goes apply 

(\x y -> (,) ((+1) x) ((+1) y)) 

ラムダのパラメータはどのように統一されていますか?

+2

定義することにより、上この応用例は、f <*> g = \ x - > fx(gx) 'です。ここで 'f'がバイナリの場合、結果は単項関数になります。最後の結果は '\ x - >(、)((+1)x)((+1)x)'でなければなりません。 – chi

答えて

4

はのは、あなたの例では種類を見てみましょう:

(,)   <$> (+1)   <*> (+1) 
^    ^    ^
|     |     | 
a -> b -> (a, b) Num a => a -> a  Num a => a -> a 

(<$>)のRHSと(<*>)のRHS/LHSはApplicativeのファンクタでなければなりません。ファンクタはNum a => (->) a(モナドリーダー)です。

a -> b -> (a, b) <$> Num a => (->) a a ==> Num a => (->) a (b -> (a, b)) 

(<*>)後(擬似コード):

Num a => (->) a (b -> (a, b)) <*> Num a => (->) a a ==> Num a => (->) a (a, a) 

しかしNum a => (->) a (a, a)Num a => a -> (a, a)と同等です

ので、(<$>)アプリケーション(擬似コード)の後にどのような種類になります。


@chiが頭で書いたように、タイプ(->) rの実装(<*>)は次のとおりです。

(<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b 
f <*> g = \r -> f r (g r) 

そして、あなたが適用された場合、あなたが買ってあげる:

(\x y -> (,) x y) <$> (\r -> r + 1) <*> (\r -> r + 1) = 
= (\r y -> (,) (r + 1) y) <*> (\r -> r + 1) = 
= \r -> (,) (r + 1) (r + 1) 
関連する問題