我是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"
但我得到一个编译错误“'估计'的例外'有不同数量的参数”
我试图了解我所犯的错误在哪里,我将Numeral传递给具有不同构造值的每个模式中的方法,即使我调用(2 *评估n)我传递的是“n”,这是Numberal in构造'Num'
问题是我的数据类型还是函数模式?
答案 0 :(得分:5)
你应该写这样的函数:
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"
首先,你需要围绕复杂模式的括号(就像把事物作为函数的参数传递一样)。其次,您似乎正在使用:
将参数分隔为Num。 (:)
是列表的构造函数,在这里没有意义。
我建议您将来编写像f a
而不是f(a)
这样的函数应用程序,因为这可以帮助您更好地掌握Haskell语法中优先级的工作原理。