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比较新,所以任何帮助都会受到赞赏.提前致谢
编译器应该如何知道它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)
| 归档时间: |
|
| 查看次数: |
614 次 |
| 最近记录: |