【问题标题】:Haskell: Pattern Syntax in expression context:_Haskell:表达式上下文中的模式语法:_
【发布时间】:2015-03-07 01:08:33
【问题描述】:

我是 Haskell 的新人。这是我的程序:

maybe_divide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide a b = case (a, b) of  
 (Just a, Just b)
 | (Just a, Just b)            
 | (Nothing, _)    -> Nothing
 | (_, Just 0)     -> Nothing
 | (_, Nothing)    -> Nothing
 | (Just a,Just b) -> Just (a `div` b)

编译器显示:表达式上下文中的模式语法:_。 当我只使用没有防护装置的情况时,它可以工作。为什么它在守卫中不起作用?

【问题讨论】:

  • 守卫用于进一步限制模式:在上面的示例中您不需要守卫。那么...您到底想获得什么?
  • 删除所有管道字符 (|),您的代码将编译。
  • @chi,这看起来像是在尝试在 Haskell 中使用 ML 语法。
  • @dfeuer 我也是这么想的,但是关于守卫与模式的评论让我很困惑。

标签: haskell case pattern-guards


【解决方案1】:

正如文章中提到的,模式匹配不需要守卫。您可以删除一些多余的案例。

maybe_divide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide a b = case (a, b) of
                    (Just _, Just 0) -> Nothing
                    (Just n, Just d) -> Just (n `div` d)
                    _ -> Nothing

但是您根本不必编写该函数。因为 Maybe 是 Monad,所以你可以写这个。

maybeDivide :: Integer -> Integer -> Maybe Integer
maybeDivide _ 0 = Nothing
maybeDivide n d = Just (n `div` d)

然后要获得你的 Maybe_divide 版本,你可以写这个。

maybe_divide' :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide' a b = a >>= (\n -> b >>= (\d -> maybeDivide n d))

这可能更容易阅读。

maybe_divide'' :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_divide'' a b = do
    n <- a
    d <- b
    maybeDivide n d 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2017-04-20
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多