[英]Applicative's Interchange Law
應用程序編程與效果 ,McBride和Paterson的論文,提出了交換法 :
u <*> pure x = pure (\\f -> fx) <*> u
為了嘗試理解它,我嘗試了以下示例 - 表示左側。
ghci> Just (+10) <*> pure 5
Just 15
我怎么能用右手邊寫這個例子?
另外,如果u
是f (a -> b)
,其中f
是Applicative
,那么右邊的函數是什么: pure (\\f -> fx) ...
?
它將寫成
pure (\f -> f 5) <*> Just (+10)
甚至
pure ($ 5) <*> Just (+10)
在這種情況下兩者都是等價的。 從字面上看,你用一個pure
函數包裝一個函數,它接受另一個函數作為它的參數,然后將x
應用於它。 你提供f
作為Just
的內容,在這種情況下是(+10)
。 當你看到(\\f -> fx)
的lambda語法時,它是非常文字的,這是一個用於這個定義的lambda。
這個定律的關鍵是關於Applicative
Functor保持指數:在原點中指數是什么,在類別的圖像中也是指數。
請注意, Applicative
Functor的實際操作是以下類型的轉換: strength :: (fa, fb) -> f (a, b)
; 然后ap
或<*>
只是對結果的fmap eval
,或者,寫得完全, ap = curry $ fmap (uncurry ($)) . strength
ap = curry $ fmap (uncurry ($)) . strength
。
這個定律然后說,因為在原點g $ x == ($ x) $ g
,提升($)
, x
和($ x)
應該保持平等。 注意,“正常” Functor
只有在g
被提升時才會保持相等,但Applicative
Functors將保留f (a->b)
類型的任何對象代替g
這種相等性。 這樣整個類型f (a->b)
行為類似於fa -> fb
,而對於“normal” Functor
,它只需要像fa -> fb
一樣表示原點中箭頭的圖像(使圖表通勤並履行Functor
的承諾)。
至於代表法律的右手邊,你已經被建議從字面上理解, pure ($ 5) <*> Just (+10)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.