2011-01-04 7 views
0

Ich bekomme, was ich denke, ist ein Gedankenstrich Fehler mit dem folgenden CodeHaskell: Was ist mein indent Fehler

152  -- find the first one who can refute the scenario 
153  let cs = map ($scenario) [ Suspect . getWho, Room . getWhere, Weapon . getHow ] 
154  let (qs,rss) = break (not . null . intersect cs . hand) ps 
155  unless (null rss) $ do 
156  let refuter:ss= rss 
157  let valid = intersect cs $ hand refuter 
158 
159  (refuter, shown) <- if cheated refuter 
160        -- if the refuter is a cheater, just choose for him 
161        then return (refuter, head valid) 
162        else do 
163        (refuter, shown) <- runStateT $ reveal scenario 
164        -- make sure they don't cheat 
165        return if shown `elem` valid 
166           then (refuter, shown) 
167           else (refuter { cheated = True }, head valid) 
168  putTail (qs ++ refuter:ss) 
169  return() 

Der Fehler Ich erhalte wird

Game.hs:159:6: 
    The last statement in a 'do' construct must be an expression 

Wenn ich löschen oder Kommentar Aus den Zeilen 159-167 geht der Fehler weg.

Was mache ich falsch?

+0

Ich denke, dass diese Stack-Austausch [Vorschlag] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "Code-Review") könnte für Sie von Interesse sein. Wenn es deine Unterstützung zeigt und hilf es in die Beta zu kommen :) – greatwolf

Antwort

5

Sie müssen Klammern setzen um den if-then-else in dem Wert für return in Zeile 165:

return (if shown `elem` valid 
      then (refuter, shown) 
      else (refuter { cheated = True }, head valid)) 

Ein reinen if-then-else nicht allowed durch die Haskell Grammatik als Funktion Argument ist , es muss in Klammern gesetzt werden, um an diesem Ort verwendet zu werden. (Es ist ein LEXP während ein Funktionsargument ein aexp sein muss.)

Die Fehlermeldung ist nicht sehr hilfreich in dieser Frage zu finden.

4
return $ if .. 

Dies sollte funktionieren. Angelegenheit der Funktion Anwendungspriorität.