ram*_*ion 0 haskell indentation
我通过以下代码得到了我认为的缩进错误
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 ()
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
Game.hs:159:6:
The last statement in a 'do' construct must be an expression
Run Code Online (Sandbox Code Playgroud)
当我删除或注释掉第159-167行时,错误消失了.
我究竟做错了什么?
你需要return在第165行的值中的if-then-else周围加上括号:
return (if shown `elem` valid
then (refuter, shown)
else (refuter { cheated = True }, head valid))
Run Code Online (Sandbox Code Playgroud)
Haskell语法不允许将纯if-then-else 作为函数参数,它必须放在括号中以便在该位置使用.(它是一个lexp,而函数参数必须是一个aexp.)
生成的错误消息对查找该问题不是很有帮助.
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |