2012-09-29 125 views
-3

給該函數的定義 FMAP ::(A-> B) - > IO一個 - > IO bHaskell的函數定義IO

其是通過將所述函數應用於變換的相互作用的影響其結果。你應該使用do構造來定義它。

我該如何定義fmap?我不知道嗎?

有人可以幫我嗎?

謝謝〜!

+0

你對Functors和Monads的熟悉程度如何? – phg

回答

6

它看起來像作業或什麼東西,所以我會給你足夠的提示,讓你可以自己工作的其他細節。

fmap1 :: (a -> b) -> IO a -> IO b 
fmap1 f action = 

action是作爲IO動作和f是從ab因此鍵入a -> b的功能。

如果您熟悉其類型爲一元的綁定>>=(簡化IO單子)

(>>=) :: IO a -> (a -> IO b) -> IO b 

現在,如果你看一下

action >>= f 

這意味着執行IO動作返回的輸出(稱爲a類型的out)並將輸出傳遞到f,其類型爲a -> IO b,因此f outIO 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的定義轉換爲做構造。

+0

非常感謝!我認爲你的代碼的最後部分應該返回(f out),對吧?不f出 – Chwa

+0

@Justin那有關係嗎?嘗試運行並看看。 – Satvik

2

您是否熟悉地圖?

類型地圖的是

地圖::(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

1

注意每個單子是已經是仿函數。但是,如果你想重新實現fmap,你可以很容易地用單子函數來實現。一個monad law是這樣的:

fmap f xs = xs >>= return . f 

如果你瞭解做記號的話,你應該能夠把這種自己。如果沒有,請問。