nestedApply :: (Applicative f, Applicative g) => g (f (a -> b)) -> f a -> g (f b)
如型別所示,如何讓那個(a->b)應用于背景關系f中的那個a?
謝謝你的幫助。
uj5u.com熱心網友回復:
這就是那種專注于型別的情況,是很有幫助的。我將嘗試保持簡單,并解釋其中的原因。
讓我們從描述任務開始。我們有gfab :: g(f(a->b))和fa :: f a,并且我們希望有g(f b)。
gfab :: g (f (a -> b) )
fa :: f a
?1 :: g (f b)
由于g是一個函式,為了得到g T型別,我們可以從g U型別的值??2開始,然后將fmap應用到??3 :: U -> T。在我們的例子中,我們有T = f b,所以我們要找:
gfab :: g (f (a -> b) )
fa :: f a
?2 :: g U
?3 :: U -> f b
?1 = fmap ?3 ?2 :: g (f b)
現在,看起來我們應該選擇??2 = gfab。畢竟,這是我們擁有的唯一的g Something型別的值。我們得到U = f (a -> b)。
gfab :: g (f (a -> b) )
fa :: f a
?3 :: f (a -> b) -> f b
?1 = fmap ?3 gfab :: g (f b)
讓我們把??3變成一個lambda, (x :: f (a->b)) -> ?4與? ?4 :: f b。(x的型別可以省略,但我決定添加它以解釋發生的事情)
gfab :: g (f (a -> b)
fa :: f a
?4 :: f b
?1 = fmap ( (x :: f (a->b)) -> ?4) gfab :: g (f b)
如何制作??4。那么,我們有f (a->b)和f a型別的值,所以我們可以<*>這些來得到f b。我們最后得到:
gfab :: g (f (a -> b) )
fa :: f a
?1 = fmap ( (x :: f (a->b)) -> x <*> fa) gfab :: g (f b)
我們可以把它簡化為:
nestedApply gfab fa = fmap (<*> fa) gfab
現在,這并不是最優雅的方法,但理解這個程序是很重要的。
uj5u.com熱心網友回復:
用
nestedApply :: (Applicative f, Applicative g)
=> g (f (a -> b))
-> f a
-> g (f b )
為了使(a->b)應用于背景關系f中的a,我們需要在背景關系中操作g。
而這只是fmap。
翻轉的簽名更清晰,重點是它的最后部分
flip nestedApply :: (Applicative f, Applicative g)
=> f a
-> g (f (a -> b)) ----從這里開始。
-> g (f b ) ----到這里。
因此,我們這里的情況是
nestedApply gffun fx = fmap (bar fx) gffun
隨著bar fx被應用于下 g 包裹由fmap為我們。這就是
bar fx :: f (a -> b)
-> f b
即:
bar : : f a
-> f (a -> b)
-> f b
而這只是<*>,不是嗎,又翻轉了。這樣我們就得到了答案,
nestedApply gffun fx = fmap (< *> fx) gffun
我們可以看到只有fmap的g功能被使用,所以我們只需要
nestedApply :: (Applicative f, Functor g) => ...
在型別簽名中。
在型別簽名中。
當把它寫在一張紙上時,很容易,在2D。我們在這里模仿了瘋狂的縮進,以獲得垂直對齊的效果。
是的,我們人類先是在紙上學會了寫,后來才在打字機上打字。上一代或兩代人從年輕時就被當代設備逼迫著進行線性打字,但現在涂鴉和說話(以及手勢和指向)將有望再次接管。創造性的輸入模式最終將包括3D作業流程,這將是一個明確的進步。一維不好,二維好,三維更好。例如,許多類別理論圖在用3D繪制時更容易理解(至少是想象)。經驗法則是,它應該是easy,而不是hard。如果它太忙了,它可能需要另一個維度。
只是在玩。
只是在包裝下玩連接線。幾張不言而喻的圖,就完成了。
這里有一些型別的曼陀羅給你(再次翻轉):
-- <$> -- <*> -- =<</span>
f a f a f a
(a -> b) f (a -> b) (a -> f b)
f b f b f ( f b) -- fmapped,并且
f b -- joined。
當然還有所有應用之母,
-- $
a
a -> b
b
又名Modus Ponens (yes, also flipped)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/326661.html
標籤:
