2017-05-25 17 views
1

(Something -> Something)のような関数を使用して返しますが、タイプは(Maybe Something -> Maybe Something)ですか?Haskellで関数が変わっている可能性があります

例えば:

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があります。 fMaybeに置き換えた場合(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

2番目の引数が' Nothing'の場合はどうなりますか?実際に 'makeItMaybe f Nothing = Nothing'を定義することはできますが、それは' fmap'の定義です。 – baxbaxwalanuksiwe

3

機能したいがfmapです:

makeItMaybe = fmap 

fmapFunctor型クラスで定義されます。

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

Maybe

(a -> b) -> Maybe a -> Maybe b 
を入力しているので、 fmapMaybeに特化したファンクタのインスタンスを持っています
+2

あなたはあなたの答えに自由変数として 'f'を使っていますが、' f'は 'makeItMaybe'へのパラメータの一つですから、より正確な答えは' makeItMaybe = fmap'です。 。 – amalloy

+0

@amalloy - ありがとう、修正されました。 – Lee

関連する問題