給該函數的定義 FMAP ::(A-> B) - > IO一個 - > IO bHaskell的函數定義IO
其是通過將所述函數應用於變換的相互作用的影響其結果。你應該使用do構造來定義它。
我該如何定義fmap?我不知道嗎?
有人可以幫我嗎?
謝謝〜!
給該函數的定義 FMAP ::(A-> B) - > IO一個 - > IO bHaskell的函數定義IO
其是通過將所述函數應用於變換的相互作用的影響其結果。你應該使用do構造來定義它。
我該如何定義fmap?我不知道嗎?
有人可以幫我嗎?
謝謝〜!
它看起來像作業或什麼東西,所以我會給你足夠的提示,讓你可以自己工作的其他細節。
fmap1 :: (a -> b) -> IO a -> IO b
fmap1 f action =
action
是作爲IO
動作和f
是從a
到b
因此鍵入a -> b
的功能。
如果您熟悉其類型爲一元的綁定>>=
(簡化IO
單子)
(>>=) :: IO a -> (a -> IO b) -> IO b
現在,如果你看一下
action >>= f
這意味着執行IO
動作返回的輸出(稱爲a
類型的out
)並將輸出傳遞到f
,其類型爲a -> IO b
,因此f out
是IO b
。
如果你看一下所謂return
第二函數有一個類型(同樣爲運動簡化的單子IO
)
return :: a -> IO a
這需要a
型的純值,並給出IO a
類型的IO
作用。
現在讓我們回顧fmap
。
fmap1 f action
其執行IO
操作,然後對動作的輸出運行f
,然後將輸出到IO b
類型的另一IO
動作。因此,
fmap1 f action = action >>= g
where
g out = return (f out)
現在來到do
符號的語法糖。這只是以另一種方式寫入綁定>>=
。
在do
符號,你可以通過
out <- action
得到一個動作的輸出,從而綁定只是減少了
action >>= f = do
out <- action
f out
我現在認爲你將能夠FMAP的定義轉換爲做構造。
您是否熟悉地圖?
類型地圖的是
地圖::(A - > B) - >並[a] - >並[b]如果運行
地圖
(* 5)[1 ,2,3]
你
[5,10,15]
地圖的一點是給它一個轉換函數的n和一個源列表,並讓它將變換應用到列表中以獲得結果列表。
map是列表的fmap。他們希望你爲IO類型編寫一個fmap,這有幫助嗎?
如果您想了解更多關於FMAP閱讀http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass
注意每個單子是已經是仿函數。但是,如果你想重新實現fmap
,你可以很容易地用單子函數來實現。一個monad law是這樣的:
fmap f xs = xs >>= return . f
如果你瞭解做記號的話,你應該能夠把這種自己。如果沒有,請問。
你對Functors和Monads的熟悉程度如何? – phg