【问题标题】:"Non-exhaustive patterns in function" error when appending value before function call在函数调用之前附加值时出现“函数中的非详尽模式”错误
【发布时间】:2019-10-11 13:37:54
【问题描述】:

我不确定我没有处理什么。假设我有一个函数,它将整数转换为字符串。叫它converter

现在,要将位置整数转换为字符串,我只需调用converter。要将负整数转换为字符串,我将 - 附加到 converter 调用。

这是我的代码:

converter :: Integer -> String
converter x
    | x == 0 = "0"
    | x == 1 = "1"
    | x == 2 = "2"
    | x == 3 = "3"
    | x == 4 = "4"
    | x == 5 = "5"
    | x == 6 = "6"
    | x == 7 = "7"
    | x == 8 = "8"
    | x == 9 = "9"
    | x > 9 = z
    where
    (a, b) = divMod x 10
    z = (converter a) ++ (converter b)

negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
    | x >= 0 = converter x
    | x < 0 = "-" ++ (converter x)

当我运行代码并尝试 negOrPosConverter (ActualInt (-200)) 时,我收到此错误:

"-*** Exception: theConverter.hs:(19,1)-(27,32): Non-exhaustive patterns in function converter

知道为什么吗?

【问题讨论】:

  • 旁注:可以将converter的主体替换为if ((0&lt;=x) &amp;&amp; (x&lt;10)) then show x else zshow 是主库中的一个有用函数,可以将大多数非字符串值转换为字符串。
  • 记得开启警告,以便在编译时发现这些问题。如果你有一个警卫名单| condition = something | condition2 = something | ...,最后一个应该是... | otherwise = something,以确保抓住所有剩余的案件。

标签: haskell pattern-matching non-exhaustive-patterns guard-clause


【解决方案1】:

问题是converter 只为非负数定义。当 "-" 为负数时,您会在前面加上一个 "-",但您忘记反转您传递给它的实际数字。试试这个:

negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
    | x >= 0 = converter x
    | x < 0 = '-' : converter (-x)

注意converter (-x) 而不是converter x


另外,如果这不仅仅是为了练习,请注意 Prelude 中已经存在 show 函数,用于将数字(以及许多其他东西)转换为字符串。

【讨论】:

  • 有效。澄清一下,当我执行"-" ++ (converter x) 时,究竟是什么传递给converter 然后让我的代码失败?我认为把它放在括号 (converter x) 中只会将 x 传递给转换器,然后添加 -?对。只是为了学习和习惯 Haskell 编程。
  • @user2719875 它只是将x 传递给转换器。问题是x 在这种情况下为负数,而converter 不适用于负数。
  • @user2719875 '-' :"-" ++ 做同样的事情。 : 只是让你一次添加一个元素比++ 更有效。
  • 好的,所以converter (-x) 基本上是解决问题的方法,对吧? x &lt; 0 = '-' : converter (-x) 行表示,如果 x &lt; 0 即负整数,则将其作为参数传递给 converter 在否定它 (converter (-x)) 后,使其在传递给 converter 时变为正数。我的理解对吗?
  • @user2719875 如果你看(++)的定义,你会发现相关的情况是(x:xs) ++ ys = x : xs ++ ys,而"-"'-':[]是一回事,所以@987654349 @ 等价于'-' : converter x,它在converter x 的结果前面加上'-'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多