我要實現的功能maybemap
哈斯克爾類似的功能(也許)
它(類似於函數圖)的功能
f :: a -> b
應該適用於一個列表類型Maybe a
並給出了一個名單Maybe b
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
我將如何定義maybemap
功能?
我要實現的功能maybemap
哈斯克爾類似的功能(也許)
它(類似於函數圖)的功能
f :: a -> b
應該適用於一個列表類型Maybe a
並給出了一個名單Maybe b
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
我將如何定義maybemap
功能?
最簡單的解決方案,正如它提到的那樣,它是
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
您可以只使用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)
總之''maybemap = map。 fmap'。或者事實上,'maybemap = fmap fmap fmap' ...嘿,我們之前沒有看到過嗎? – leftaroundabout
謝謝!這個功能有什麼意義?你可以證明它是否有效? – haskellnoob
而且'(r - >)'也是一個組合函數,它的組成是'fmap',你可以編寫'fmap2'= fmap fmap fmap',它和'fmap2'具有相同的簽名。 – kqr
@kqr但是我不容易使用它,'(fmap fmap fmap)(++「!」)[Nothing,只是「u」]'拋出一個錯誤。 – viorior
然後你一定是犯了一個錯字(或者我錯過的其他東西是錯誤的),因爲你在評論中寫的確切的一行適用於我。 – kqr