【问题标题】:How to use error in a Haskell function?如何在 Haskell 函数中使用错误?
【发布时间】:2018-08-07 20:07:55
【问题描述】:

我正在使用 GHCI 7.10.3,但在一个简单的代码中出现错误。

我想做这样的事情:

fatorial n
    | n == 0  = 1
    | n > 0 = n * fatorial(n-1)
    | otherwise = error "My error"

但是当fatorial -4被调用时,输出是:

:21:1: 约束中的非类型变量参数:Num (a -> a) (使用 FlexibleContexts 来允许这样做) 检查“它”是否具有推断类型时 它 :: forall a. (Num a, Num (a -> a), Ord a) => a -> a

我的代码没有最后一行就可以正常工作。那么如何在haskell中使用错误信息呢?

【问题讨论】:

  • 那是因为 Haskell 把它解释为factorial - 4(所以是减法),你应该使用factorial (-4)
  • 我不太相信“我的代码没有最后一行也能正常工作”。是什么让你这么认为?

标签: haskell ghci


【解决方案1】:

这个错误是一个类型错误,所以这意味着 Haskell 认为你写的东西没有意义(从类型系统的角度来看)。

它将- 解释为“二元减号运算符”,例如:

--         v operator
factorial  -  4
-- ^  operand ^ 

所以 Haskell 认为你想从 factorial 中减去 4,但它没有看到 factorialNumber,因此出现了错误。严格来说,一个可以制作函数Numbers,只要实现Num typeclass(以及EqShow类型类)就可以了。

如果你想在这样的函数调用中使用负数字面量,你需要使用括号,比如:

factorial <b>(-4)</b>

这会产生:

Prelude> fatorial (-4)
*** Exception: My error
CallStack (from HasCallStack):
  error, called at <interactive>:5:19 in interactive:Ghci1

所以现在它提高了你的error "My error"(见第一行输出)。

【讨论】:

  • 好的!谢谢你的帮助。这是fatorial(pt语言......)。 ;)
  • @eightShirt:啊,我删除了注释:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多