2017-05-25 102 views
1

是否可以編寫一個函數,其功能類似(Something -> Something),並返回它,但是類型爲(Maybe Something -> Maybe Something)在Haskell中將函數更改爲Maybe函數

例如爲:

f :: Point -> Point 
f x = [some code goes here] 

makeItMaybe :: (Point -> Point) -> (Maybe Point -> Maybe Point) 
makeItMaybe x = ??? 

我知道它是與單子和Applicatives,卻無法真正弄清楚如何。我玩了一下<*><$>,但沒有得到任何地方。

任何幫助或指針在正確的方向將不勝感激。謝謝!

+0

'makeItMaybe = fmap' – 4castle

回答

6

我認爲您在尋找fmap,其型號爲Functor f => (a -> b) -> f a -> f b。如果您將f替換爲Maybe(因爲Maybe是一個仿函數),並將括號放在正確的位置,您將得到(a -> b) -> (Maybe a -> Maybe b)。你在(<$>)的正確方向,這只是fmap的別名。

所以我們有makeItMaybe f x = fmap f x或更簡單地makeItMaybe = fmap

1

此功能滿足了簽名,但我不知道這是否是你想要什麼:

makeItMaybe :: (a -> a) -> (Maybe a -> Maybe a) 
makeItMaybe f (Just x) = Just (f x) 
makeItMaybe f Nothing = Nothing 

由於@baxbaxwalanuksiwe和@Lee指出,這是從Functor類型類Maybefmap實例。

+0

如果第二個參數是'Nothing'會發生什麼?你確實可以定義'makeItMaybe f Nothing = Nothing',但是這就是'fmap'的定義。 – baxbaxwalanuksiwe

3

的功能,你想要的是fmap

makeItMaybe = fmap 

fmapFunctor類型類定義:

fmap :: Functor f => (a -> b) -> f a -> f b 

Maybe有函子的實例,以便fmap專門用於Maybe已鍵入

(a -> b) -> Maybe a -> Maybe b 
+2

您在回答中使用'f'作爲自由變量,但在問題'f'是'makeItMaybe'的參數之一,所以更準確的答案是'makeItMaybe = fmap',就像在接受的答案中一樣。 – amalloy

+0

@amalloy - 謝謝,修正。 – Lee