Ahm*_*mad 0 haskell pattern-matching
我是Haskell编程语言的新手,我正在尝试创建一个数据类型来表示二进制数,并编写一个函数来计算其十进制值.
我想用二进制数字代表这个BNF
Numeral ::= 0 | 1 | Numeral 0 | Numeral 1
我使用模式匹配和像这样的字段标签在haskell中构建了它的数据类型
data Numeral = Zero | One | Num {number :: Numeral, suffex :: Int}
我创建了一个函数
valuate Zero = 0
valuate One = 1
valuate Num(n:0) = 2 * valuate (n)
valuate Num(n:1) = 2 * valuate (n) + 1
valuate Num(n:ns) = error "Not binary number"
Run Code Online (Sandbox Code Playgroud)
但我得到一个编译错误"'估计'的例外'有不同数量的参数"
我试图理解我所犯的错误在哪里,我将Numeral传递给具有不同构造值的每个模式中的方法,甚至在我调用时(2*评估n)我传递的是"n",这是构造中的Numberal'民"
我的数据类型或函数模式中的问题是什么?
你应该写这样的函数:
valuate Zero = 0
valuate One = 1
valuate (Num n 0) = 2 * valuate n
valuate (Num n 1) = 2 * valuate n + 1
valuate (Num n _) = error "Not binary number"
Run Code Online (Sandbox Code Playgroud)
首先,你需要围绕复杂模式的括号(就像把事物作为函数的参数传递一样).其次,您似乎正在使用:将参数分隔为Num. (:)是列表的构造函数,这里没有意义.
我建议您编写函数应用程序f a而不是f(a)将来,因为这可以帮助您更好地掌握Haskell语法中的优先级如何工作.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |