文字"1"中没有(Num Nat)的实例

Tho*_*ley 0 haskell numbers instance

我正在尝试使用自然数创建一些函数.

import Prelude
data Nat = Zero | Succ Nat

add:: Nat -> Nat -> Nat
add Zero n = n
add (Succ m) n = Succ (add m n)

mult :: Nat -> Nat -> Nat
mult x Zero = Zero
mult x (Succ y) = add x (mult x y)
Run Code Online (Sandbox Code Playgroud)

然后当我跑

mult 3 5
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

<interactive>:38:6: error:
• No instance for (Num Nat) arising from the literal ‘3’
• In the first argument of ‘mult’, namely ‘3’
  In the expression: mult 3 5
  In an equation for ‘it’: it = mult 3 5
Run Code Online (Sandbox Code Playgroud)

我对Haskell比较新,所以任何帮助都会受到赞赏.提前致谢

lef*_*out 6

编译器应该如何知道它Zero是为了表示数字0,还是Succ . Succ $ Zero数字2等等?它或多或少地盲目地猜测这是你想要的.

您可以明确地告诉它以这种方式处理数字文字,但是:

instance Num Nat where
  fromInteger 0 = Zero
  fromInteger n = Succ . fromInteger $ n - 1
Run Code Online (Sandbox Code Playgroud)

此外,即使编译器因此知道如何通过数字文字定义Nat s ,它也将无法显示给定/计算的值.为此,有一个自然的自动修复,但:Nat

data Nat = Zero | Succ Nat
   deriving (Show)
Run Code Online (Sandbox Code Playgroud)

你也可以添加Eq,Ord Enumderiving列表;事实上,派生Enum实例几乎就"盲目猜测"什么Nat值代表什么数字.其实我刚才注意到Enum不能在递归类型上派生出来Nat; 如果有可能你可以写:

instance Num Nat where
  fromInteger = toEnum . fromInteger
Run Code Online (Sandbox Code Playgroud)