Bạn đã gãi đầu trong một ngày qua cái này.Biểu thức Monadic trong điều kiện - biên dịch GHC, từ chối cabal
Tôi có một vài chức năng trong mã của tôi trông như thế này:
function :: IO (Maybe Whatever)
function = do
monadFun
yaySomeIO
status <- maybeItWillFail
if checkStatus status -- Did we succeed?
then monadTime >>= return . Just . processItPurely
else return Nothing
ghci sẽ được tải và chạy này một cách tương tác với không có vấn đề, và GHC sẽ biên dịch nó hạnh phúc. Chạy này qua cabal, tuy nhiên, mang lại cho tôi điều này:
myProgram.hs:94:16:
Unexpected semi-colons in conditional:
if checkStatus status; then monadTime >>= return . Just . processItPurely; else return Nothing
Perhaps you meant to use -XDoAndIfThenElse?
Và bất cứ điều gì tùy chọn -XDoAndIfThenElse
này là, tôi dường như không thể tìm thấy một dấu vết của nó bất cứ nơi nào trong bất kỳ tài liệu. Tại sao cabal (hoặc là ghc này vào thời điểm này?) La hét vào tôi để sử dụng dấu chấm phẩy mà CNTT đặt ở nơi đầu tiên? Hoặc đang sử dụng các biểu thức đơn thuần trong câu lệnh if-then-else chỉ là một ý tưởng tồi?
Lưu ý rằng cabal không phàn nàn về vấn đề này tại tất cả:
case checkStatus status of
True -> monadTime >>= return . Just . processItPurely
_ -> return Nothing
... ngoại trừ đây là xấu xí như địa ngục và tôi không bao giờ muốn đặt điều này trong mã của tôi. Có ai cho tôi biết chuyện gì đang diễn ra không? Xin vui lòng và cảm ơn trước.
Cảm ơn, tôi sẽ chỉ thêm thụt lề khi cần thiết! –