在haskell中构造二进制数

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'民"

我的数据类型或函数模式中的问题是什么?

kin*_*ini 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"
Run Code Online (Sandbox Code Playgroud)

首先,你需要围绕复杂模式的括号(就像把事物作为函数的参数传递一样).其次,您似乎正在使用:将参数分隔为Num. (:)是列表的构造函数,这里没有意义.

我建议您编写函数应用程序f a而不是f(a)将来,因为这可以帮助您更好地掌握Haskell语法中的优先级如何工作.