2013-11-04 83 views
-2

我要實現的功能maybemap哈斯克爾類似的功能(也許)

它(類似於函數圖)的功能

f :: a -> b 

應該適用於一個列表類型Maybe a並給出了一個名單Maybe b

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b] 

我將如何定義maybemap功能?

回答

5

最簡單的解決方案,正如它提到的那樣,它是

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b] 
maybemap = map . fmap 

但是總的來說它是更一般的功能:

maybemap :: Functor f => (a -> b) -> [f a] -> [f b] 

正如我們看到的,名單也是一個仿函數,所以我們可以改寫

fmap2 :: (Functor f, Functor g) => (a -> b) -> g (f a) -> g (f b) 
fmap2 = fmap . fmap 

和測試:

> fmap2 (++"!") [Nothing,Just"u"] 
[Nothing,Just "u!"] 

修訂

最搞笑在fmap2,那(.)也是一個函數爲a -> b函數,而fmap是具有相同簽名的函數:f a -> f b。而我們的功能只能由fmap s:

fmap2 = fmap fmap fmap 
+1

而且'(r - >)'也是一個組合函數,它的組成是'fmap',你可以編寫'fmap2'= fmap fmap fmap',它和'fmap2'具有相同的簽名。 – kqr

+0

@kqr但是我不容易使用它,'(fmap fmap fmap)(++「!」)[Nothing,只是「u」]'拋出一個錯誤。 – viorior

+0

然後你一定是犯了一個錯字(或者我錯過的其他東西是錯誤的),因爲你在評論中寫的確切的一行適用於我。 – kqr

5

您可以只使用Maybe的函子實例,其定義如下:

fmap :: (a -> b) -> Maybe a -> Maybe b -- fmap's type for Maybe 
fmap f Nothing = Nothing 
fmap f (Just a) = Just (f a) 

利用這一點,你的函數可以這樣定義:

maybemap :: (a -> b) -> [Maybe a] -> [Maybe b] 
maybemap f = map (fmap f) 
+1

總之''maybemap = map。 fmap'。或者事實上,'maybemap = fmap fmap fmap' ...嘿,我們之前沒有看到過嗎? – leftaroundabout

+0

謝謝!這個功能有什麼意義?你可以證明它是否有效? – haskellnoob