4 Stimmen

Anzahl der Operatoren in einem Ausdruck zählen - Instanz nicht ableiten

Ich arbeite an einer Funktion, die die Anzahl der in einem Ausdruck verwendeten Operatoren zählen kann. Mein Code ist wie folgt:

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)

Aber wenn ich versuche, diesen Code mit Hugs98 auszuführen, erhalte ich die folgende Fehlermeldung:

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

Kann mir jemand sagen, was ich falsch mache? Ich habe selbst keine Idee mehr.

5voto

Frerich Raabe Punkte 85859

2+3 ist kein gültiger Ausdruck. Bei Ihren Typen werden primtive Werte mit der Methode Lit Datenkonstrukteur, und die gültigen Operatoren sind :+: y :-: . Was Sie also wirklich brauchen, ist Lit 2 :+: Lit 3 . Also versuchen

size (Lit 2 :+: Lit 3)

0voto

Thomas Eding Punkte 33018

Sie können daraus eine Num-Instanz machen:

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

Sobald das geschehen ist, size (2+3) funktioniert (beachten Sie die Klammern).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X