2014-10-05 2 views
0

Я новичок в языке программирования Haskell, и я пытаюсь создать тип данных для представления двоичных чисел и написать функцию для оценки ее десятичного значения.Построить двоичные числа в haskell

Я хочу, чтобы представить эту BNF для бинарного numberals

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" 

Но я получаю ошибку компиляции «Исключение для« оценки »имеет различное количество аргументов»

Я пытаюсь понять, где ошибка, которую я сделал, я передаю цифру методу в каждом шаблоне с другим значением конструкции и даже когда я называю (2 * оценка n), я передаю «n», который является Numberal в конструкции «Num»

Является ли проблема в моем типе данных или шаблонах функций?

ответ

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.

+1

Отличный ответ и быстрый также. спасибо. – Ahmad

+0

Конечно! Рад помочь. – kini

Смежные вопросы