簡體   English   中英

函子上的 Fmapping

[英]Fmapping over functors

假設我有以下代碼:

data LiftItOut f a = LiftItOut (f a)
    deriving Show

instance (Functor fct) => Functor (LiftItOut fct) where
    fmap f (LiftItOut fctor) = LiftItOut (fmap f fctor)

如果我嘗試調用fmap (\x-> 3 x) (LiftItOut (+3))它不起作用。 但是,工作沒有意義嗎? 結果將是LiftItOut (fmap (\x ->3 x) (+3))並且,正如我所看到的,3 將被饋送到 (+3) 並且結果將被包裝在LiftItOut中。 我在 learnyouahaskell 上讀到了關於(->r)仿函數的內容,盡管它並沒有引起我的共鳴。 感謝任何幫助

你是對的,你會到達LiftItOut (fmap (\x -> 3 x) (+3)) ,並且你正確地確定了感興趣的包裝函子是 function 函子(注意(r ->)仿函數,而不是(-> r)仿函數),但你從那里的推理有點草率。 回想一下,對於函數,我們有fmap = (.) 所以:

LiftItOut (fmap (\x -> 3 x) (+3))
= { fmap = (.) }
LiftItOut ((\x -> 3 x) . (+3))
= { f . g = \y -> f (g y) }
LiftItOut (\y -> (\x -> 3 x) ((+3) y))
= { section application }
LiftItOut (\y -> (\x -> 3 x) (y + 3))
= { lambda application }
LiftItOut (\y -> 3 (y + 3))

...不完全是你認為你會得到的結果,我打賭:希望在這個簡化的形式中它更清楚為什么這不是真正明智的: y + 3可能足夠明智,但你試圖提供作為3的參數,它實際上不是 function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM