2016-09-18 1 views
-2

Ich versuche, ein Programm in Haskell zu schreiben, das eine Liste von Zahlen nimmt und den Wert der größten aufeinanderfolgenden Subsequenz zurückgibt.Guards in der else-Anweisung werden nicht kompiliert: Parse-Fehler bei Eingabe '|'

Ich bekomme einen Kompilierungsfehler für Zeile 7, die Zeile mit dem ersten Schutz.

maxsubseq list = maxsubseqRecurse 0 list 

maxsubseqRecurse sofar restOfList = 
    if null restOfList 
     then sofar 
     else 
     | if newSofar < 0 
     |  then maxsubseqRecurse 0  newRestOfList 
     |  else maxsubseqRecurse sofar newRestOfList 
     where 
      newSofar = sofar + head restOfList 
      newRestOfList = tail restOfList 

Warum sind die Wächter nicht gültige Syntax? Meine Absicht ist es, die Definition von newSofar und newRestOfList für die drei Linien, in denen es Wachen gibt, verfügbar zu machen.

Antwort

4

Grob gesagt, sind Wächter auf der linken =, wie in

f x y 
    | cond1 x y = ... 
    | cond2 x y = ... 
    | otherwise = ... 

In Ihrem Code verwendet wird, entfernen Sie einfach die | - Sie müssen nicht Wachen brauchen. if genügt.

Auch if null, head, tail ist unidiomatisch, da bessere Alternativen existieren. Denken Sie daran, dass head,tail Ihr Programm an dem Tag zum Absturz bringen wird, an dem Sie die null Kontrolle vergessen werden. Da die Mustererkennung dieses Problem nicht aufweist, wird es nach Möglichkeit sehr bevorzugt.

maxsubseqRecurse sofar [] = sofar 
maxsubseqRecurse sofar (h:newRestOfList) = 
    if newSofar < 0 
    then maxsubseqRecurse 0  newRestOfList 
    else maxsubseqRecurse sofar newRestOfList 
     where 
     newSofar = sofar + h 

Wiedereinführung Wachen, erhalten wir:

maxsubseqRecurse sofar [] = sofar 
maxsubseqRecurse sofar (h:newRestOfList) 
    | newSofar < 0 = maxsubseqRecurse 0  newRestOfList 
    | otherwise = maxsubseqRecurse sofar newRestOfList 
    where 
    newSofar = sofar + h 
Verwandte Themen