【问题标题】:Parse error in HaskellHaskell 中的解析错误
【发布时间】:2010-12-01 02:14:03
【问题描述】:

以下代码:

import IO
import System(getArgs)

main = do
    args <- getArgs
    let l = length args
    if l == 0
        putStrLn "foo"
    else
        putStrLn "bar"

为 if-else 子句生成解析错误。我试过使用花括号无济于事。 救命!

【问题讨论】:

    标签: haskell parse-error


    【解决方案1】:

    只是为了证明我对马克的回答的评论,

    import System.Environment (getArgs)
    
    main :: IO ()
    main = do
        args <- getArgs
        let l = length args
        if l == 0
          then putStrLn "foo"
          else putStrLn "bar"
    

    是合法的 Haskell。


    使用 GHC 7.0 的 {-# LANGUAGE RebindableSyntax #-} 扩展,您甚至可以侥幸逃脱

    class IfThenElse a b c d | a b c -> d where
        ifThenElse :: a -> b -> c -> d
    instance IfThenElse Bool a a a where
        ifThenElse True = const
        ifThenElse False = flip const
    instance (Monad m, IfThenElse a (m b) (m b) (m b))
          => IfThenElse (m a) (m b) (m b) (m b) where
        ifThenElse = liftM ifThenElse
    
    main =
        if liftM null getArgs
          then putStrLn "foo"
          else putStrLn "bar"
    

    (无耻模仿blog.n-sch.de。)

    【讨论】:

      【解决方案2】:

      两个问题:

      1. 您缺少the let-in clausein 部分(请参阅(并接受)@ephemient's answer

      2. 您缺少the if-then-else clausethen 部分

      所以它可能看起来像:

      import IO import System(getArgs)
      
      main = do
          args <- getArgs
          let l = length args in
              if l == 0 then
                  putStrLn "foo"
              else
                  putStrLn "bar"
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 2018-12-11
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多