gpt4 book ai didi

Haskell - 也许算术

转载 作者:行者123 更新时间:2023-12-02 02:48:39 25 4
gpt4 key购买 nike

我被要求实现一个使用以下配置文件的函数:

maybe_divide :: Maybe Integer -> Maybe Integer -> Maybe Integer

并以下列方式响应:
> maybe_divide (Just 5) (Just 2) 
Just 2
> maybe_divide (Just (-5)) (Just 2)
Just (-3)
> maybe_divide (Just (-5)) (Just 0)
Nothing
> maybe_divide Nothing (Just 1)
Nothing
> maybe_divide (Just 1) Nothing
Nothing

我写了以下内容,但它不会编译。大家有什么建议吗?
maybe_divide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide x y = case x of
Just x' -> case y of
Just y'
| y' == 0 -> Nothing
| otherwise -> x' `div` y'
Nothing -> Nothing

最佳答案

与输出类型分开,我想指出一些您可能更喜欢编写此类代码的替代样式:

首先,您可以case通过将它们放在一个元组中来处理多个表达式:

case (x,y) of
(_ , Just 0) -> Nothing
(Just x', Just y') -> Just (x' `div` y')
_ -> Nothing

有几种不同的方法可以使用守卫来编写它,甚至是函数 Control.Monad.guard .
case (x,y) of
(Just x', Just y') -> (x' `div` y') <$ guard (y' /= 0)
_ -> Nothing

第二种方法将从一个函数开始:
safeDiv :: Integer -> Integer -> Maybe Integer
safeDiv x 0 = Nothing
safeDiv x y = Just (x `div` y)

现在你有 safeDiv ,您可以将其提升为 Maybe 包装的参数。非常接近 Applicative样式代码,除了额外的一层 Maybe在输出中。幸运的是,嵌套的 monad(例如 Maybe (Maybe t) )很容易崩溃:
maybe_divide x y = join $ safeDiv <$> x <*> y

甚至
maybe_divide = (join .) . liftM2 safeDiv

如果你精通无点。

就个人而言,我会使用两种元组大小写变体之一。但是已经有一个像 safeDiv 这样的函数是相当普遍的。 ,在这种情况下,第二种形式可能很有用。

关于Haskell - 也许算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16206852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com