2011-01-04 6 views
0

は、私は私が得ているエラーがハスケル:私のインデントエラー

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

私は削除またはコメントで次のコード

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() 

とインデントエラーだと思うものを得るんですよアウトライン159~167の場合、エラーは消え去る。

私は間違っていますか?

+0

私はこのスタック交換[提案](http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "コードレビュー")があなたにとって興味深いかもしれないと思います。それがあなたのサポートを示し、ベータにそれを得るのを助けるなら:) – greatwolf

答えて

5

あなたがラインにreturnの値にされたif-then-elseの周りに括弧を配置する必要があり165:

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

関数の引数としてHaskellの文法によってallowedない場合-THEN-ELSE純粋その場所で使用されるには括弧内に入れなければなりません。 (関数の引数がaexpにする必要がありながら、それはlexpです。)生成されたエラーメッセージは、その問題を見つけることで非常に有用ではありません

4
return $ if .. 

これは動作するはずです。機能の優先順位の問題。