在haskell中构造二进制数

时间:2014-10-05 01:30:12

标签: 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"

但我得到一个编译错误“'估计'的例外'有不同数量的参数”

我试图了解我所犯的错误在哪里,我将Numeral传递给具有不同构造值的每个模式中的方法,即使我调用(2 *评估n)我传递的是“n”,这是Numberal in构造'Num'

问题是我的数据类型还是函数模式?

1 个答案:

答案 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语法中优先级的工作原理。