如何在 Haskell 函数中使用错误?
How to use error in a Haskell function?
我正在使用 GHCI 7.10.3,但我在一个简单的阶梯代码中遇到了错误。
我想做这样的事情:
fatorial n
| n == 0 = 1
| n > 0 = n * fatorial(n-1)
| otherwise = error "My error"
但是当调用fatorial -4
时,输出是:
:21:1:
Non type-variable argument in the constraint: Num (a -> a)
(Use FlexibleContexts to permit this)
When checking that ‘it’ has the inferred type
it :: forall a. (Num a, Num (a -> a), Ord a) => a -> a
我的代码没有最后一行也能正常工作。那么如何在 haskell?
中使用错误消息
这个错误是一个类型错误,所以这意味着 Haskell 认为你写的东西没有意义(从类型系统的角度来看)。
它将 -
解释为“二进制减号运算符”,例如:
-- v operator
factorial - 4
-- ^ operand ^
所以 Haskell 认为你想从 factorial
中减去 4
,但它没有看到 factorial
如何是 Num
ber,因此错误。严格来说,一个 可以 创建函数 Num
bers,只要实现 Num
typeclass (as well as the Eq
and Show
类型类)我们就可以了。
如果要在此类函数调用中使用负数文字,则需要使用括号,例如:
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"
(见第一行输出)。
我正在使用 GHCI 7.10.3,但我在一个简单的阶梯代码中遇到了错误。
我想做这样的事情:
fatorial n
| n == 0 = 1
| n > 0 = n * fatorial(n-1)
| otherwise = error "My error"
但是当调用fatorial -4
时,输出是:
:21:1: Non type-variable argument in the constraint: Num (a -> a) (Use FlexibleContexts to permit this) When checking that ‘it’ has the inferred type it :: forall a. (Num a, Num (a -> a), Ord a) => a -> a
我的代码没有最后一行也能正常工作。那么如何在 haskell?
中使用错误消息这个错误是一个类型错误,所以这意味着 Haskell 认为你写的东西没有意义(从类型系统的角度来看)。
它将 -
解释为“二进制减号运算符”,例如:
-- v operator
factorial - 4
-- ^ operand ^
所以 Haskell 认为你想从 factorial
中减去 4
,但它没有看到 factorial
如何是 Num
ber,因此错误。严格来说,一个 可以 创建函数 Num
bers,只要实现 Num
typeclass (as well as the Eq
and Show
类型类)我们就可以了。
如果要在此类函数调用中使用负数文字,则需要使用括号,例如:
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"
(见第一行输出)。