我支持使用该maybe
功能的建议。你问这个问题是对的,因为这个一般的经验法则(不仅对你,而且对任何阅读它的新手):具有类似Maybe Foo -> Bar
或Maybe Foo -> Maybe Bar
直接定义的类型的函数是 Haskell 中的代码异味。您几乎从不想编写一个Maybe Foo
以参数为参数的函数;你想要一个只接受 的函数Foo
,并使用一个高阶函数来适应它Maybe Foo
。
假设你有一个函数f' :: Maybe Foo -> Maybe Bar
。这通常可以重构为:
f :: Foo -> Bar
和fmap f :: Maybe Foo -> Maybe Bar
;
f :: Foo -> Maybe Bar
和(>>=f) :: Maybe Foo -> Maybe Bar
第一种情况有效,因为这是 的Functor
实例Maybe
:
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
-- or this:
-- fmap f = maybe Nothing (Just . f)
第二种情况有效,因为这是 的Monad
实例Maybe
:
instance Monad Maybe where
return = Just
Nothing >>= f = Nothing
(Just x) >>= f = f x
-- or this:
-- mx >>= f = maybe Nothing f mx