我一直在研究'真实世界Haskell',我一直在研究如何使用Maybe。我从第3章中编写了这种数据类型和相应的函数。本书建议尝试将其转换为使用Maybe并摆脱Nil类型。我一直在玩这个,但我不知道该怎么做。我尝试过在不同的地方添加,但我真的只是猜测而不知道如何去做。 data List a = List a (List a)
| Nil
deriving (Show)
如果我们在monadPlusSDif,Maybe处选择它们作为MonadPlus的数据类型,那么这两个功能是否等效? tdif :: Int -> Int -> Maybe Int
tdif x y
| y == 0 = Nothing
| otherwise = Just (div x y)
monadPlusSDif :: MonadPlus m => Int ->
,我有以下构建在我的代码: f :: Maybe A -> X
f a = case a of
Nothing -> x
(Just b) -> case b of
Nothing -> y
(Just c) -> case c of
Nothing -> z
(Just d) -> d
,我没有看到一个明显的方式来简化,而不是
下面是两个互相递归函数对的例子。第一个示例终止并产生预期的结果。第二个例子是类似的,除了它使用Maybe monad。 fun1'在被调用时不会终止。 fun1 = 1 + fun2
fun2 = let x = fun1
in 2
-- terminates. result is 3.
fun1' = do a <- Just 1
b <- fun2'
让我们两个功能: f :: a -> Maybe b
g :: b -> Maybe c
功能>>=会以这样的方式f >>= g将与f结果执行g只有当它不Nothing工作。换句话说,它要求f和g都能成功产生任何结果。 我正在实施一个解析器,并意识到我的词法分析器会从这个相反的方面受益。那就是: f :: a -> Maybe b
g :: a -> Maybe b
planb ::
我hvae只是invended的Maybe以下替代定义: type Maybe' a = forall b. (b -> (a -> b) -> b)
just :: a -> Maybe' a
just a = \d f -> f a
nothing :: Maybe' a
nothing = const
bind :: Maybe' a -> (a -> Maybe' b) -
我想从“failable”数据类型中轻松获取某个值,或者在发生故障时使用默认值。 这是我为Maybe实现: infixr 1 <||>
(<||>) :: Maybe a -> a -> a
(<||>) = flip fromMaybe
pred :: String -> String -> Bool
pred x name = (x ==) <$> name `lookup` myM