Подсчитать количество операторов в выражении - невозможно определить экземпляр - PullRequest
4 голосов
/ 27 сентября 2011

Я работаю над функцией, которая может подсчитать количество операторов, используемых в выражении. Мой код выглядит следующим образом:

data Expr = Lit Int |
    Expr :+: Expr |
    Expr :-: Expr

size :: Expr -> Int
size (Lit n)      = 0
size (e1 :+: e2)  = 1 + (size e1) + (size e2)
size (e1 :-: e2)  = 1 + (size e1) + (size e2)

Но когда я пытаюсь выполнить этот код, используя Hugs98, я получаю следующую ошибку:

Main> size 2+3
ERROR - Cannot infer instance
*** Instance   : Num Expr
*** Expression : size 2 + 3

Может кто-нибудь сказать мне, что я делаю не так? Я действительно не в себе.

Ответы [ 2 ]

5 голосов
/ 27 сентября 2011

2+3 не является допустимым выражением. С вашими типами примитивные значения создаются с помощью конструктора данных Lit, а допустимые операторы - :+: и :-:. Итак, что вам действительно нужно, это Lit 2 :+: Lit 3. Так что попробуйте

size (Lit 2 :+: Lit 3)
0 голосов
/ 27 сентября 2011

Вы можете сделать его экземпляром Num:

instance Num Expr where
  (+) = (:+:)
  (-) = (:-:)
  negate = (0 -)
  fromInteger = Lit . fromInteger
  (*) = error "not implemented"
  abs = error "not implemented"
  signum = error "not implemented"

Как только это произойдет, size (2+3) будет работать (обратите внимание на круглые скобки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...