【问题标题】:parse error in maybe divide (Haskell)解析错误可能除法(Haskell)
【发布时间】:2013-03-21 10:36:59
【问题描述】:

只是一个我无法解决的简单问题 我试图通过以下代码获得maybe_divide作为分配所需,但是终端给我一条错误消息

test2.hs:1:112: 模式中的解析错误:(Just x)

maybe_devide :: Maybe Float -> Maybe Float -> Maybe Float
maybe_devide maybeX maybeY = case maybeX maybeY of
  (Just x) (Just y)
    |x/=0 && y/=0 -> Just (div x y)
    |x=0 && y/=0  -> Just 0
    |x/=0 && y=0  -> Nothing
  Nothing (Just y) -> Nothing
  (Just x) Nothing -> Nothing

谁喜欢告诉我它有什么问题? 谢谢

【问题讨论】:

  • maybeDivide mx my = do x <-mx; y <- my; guard (y /= 0); return (div x y)
  • 为什么将x=0 作为特例?顺便说一句,应该是==
  • 哈哈,这是个意外,我刚发完这个问题就改了,
  • @augustss,对不起,我在 haskell 中没有走这么远,所以我不知道 return 和

标签: haskell pattern-matching maybe


【解决方案1】:

maybeX maybeY 将函数maybeX 应用于参数maybeY,而您打算对(maybeX,maybeY) 进行案例分析。此外,您应该使用== 来表示平等,而不是使用单个=。以下将按您的意愿执行:

maybe_devide :: Maybe Float -> Maybe Float -> Maybe Float
maybe_devide maybeX maybeY = case (maybeX,maybeY) of
  (Just x,Just y)
    |x/=0 && y/=0 -> Just (div x y)
    |x==0 && y/=0  -> Just 0
    |x/=0 && y==0  -> Nothing
  (Nothing,Just y) -> Nothing
  (Just x,Nothing) -> Nothing

或者,您可以使用 Maybe monad,如

maybe_devide :: Maybe Float -> Maybe Float -> Maybe Float
maybe_devide maybeX maybeY = do
        x <- maybeX
        y <- maybeY
        case (x,y) of
                (0,y) -> Just 0
                (x,0) -> Nothing
                (x,y) -> Just (div x y)

【讨论】:

  • 非常感谢,但是,当我尝试您的 maydevide 版本时,终端显示以下错误消息“[1 of 1] Compiling Main (test2.hs,interpreted) test2.hs:1:251 : 解析输入错误 `->' 失败,加载模块:无"
  • sry 伙计,插入新行需要很长时间,我尝试了 ENTER 但这会改为发布评论
  • 嗯。可能是ghc 的不同版本。你可以试试augustss的版本。实际上,我在 Float 上使用 div 时也会出错。
  • 哈哈,我的错,应该是整数,我已经改过了XD
  • 应该是x / y 而不是div x ydiv 用于 Integral 类型,/ 用于 Fractional 类型。此外,(0, y) 案例是不必要的,因为它已经包含在最终案例中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多