2017-05-10 3 views
0

Mein Haskell Code geht wie folgt:Fehler Parsing in Haskell Code

module Lain where 
let value = 0 
divideBy ::(Ord a, Num a)=>a -> a -> a 
divideBy _ 0 = 0 
divideBy num den 
    | (num - den) >= 0 = do 
     value = value + 1 
     return divideBy (num-den) den 
    | otherwise = value 

Der Fehler beim Laden der Datei Haskell Lain.hs geht ist:

app/Lain.hs:18:1: error: parse error (possibly incorrect indentation or mismatched brackets) Failed, modules loaded: none.

Nicht in der Lage zu interpretieren, wo ich Ich gehe falsch, scheint mir eher ein logischer Fehler. Mein Code möchte den Quotienten Zähler und Nenner ausgeben. Bitte helfen Sie mir, was genau mein Fehler ist. Danke im Voraus.

Antwort

1

value = value + 1 ist keine gültige Anweisung in einem do Block. Die einzigen gültigen Aussagen:

  • Eine variable Bindung: let pattern = expression

  • A monadischen Bindung: pattern <- expression

  • Ein Ausdruck, der

jedoch zu einem monadischen Aktion

auswertet, Sie brauchen keinen do Block, weil Sie monadische Nebenwirkungen nicht benötigen, um zu implementieren diese Funktion ausführen. Darüber hinaus ist return nicht wie return in einer imperativen Sprache-es ist kein Schlüsselwort, das von der aktuellen Funktion zurückkehrt, sondern eine Funktion, die eine Aktion erstellt, die einen Wert zurückgibt. Es sieht so aus, als ob Ihre Absicht mit value = value + 1 darin bestand, value zu mutieren, aber es gibt keine veränderbaren Variablen in Haskell. (Es gibt änderbare Referenztypen wie IORef, aber Sie brauchen sie hier nicht.)

So eine Lösung ist einfach, einen Ausdruck zu verwenden:

divideBy :: (Ord a, Num a) => a -> a -> a 
divideBy _ 0 = 0 
divideBy num den 
    | num - den >= 0 = 1 + divideBy (num - den) den 
    | otherwise = 0 

Das sagt genau das, was es bedeutet: der Quotient von num und den ist 0, wenn den0 ist; wenn num - den >= 0, dann ist es 1 mehr als der Quotient von num - den und den; ansonsten ist es 0.

+0

Vielen Dank !! Es war sehr hilfreich! – Akash