2010-12-01 16 views
0

で解析エラー次のコード:ハスケル

import IO 
import System(getArgs) 

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

は、if-else節のためのパースエラーを生成します。中括弧を使用して無駄にしようとしました。 ヘルプ!

答えて

5

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からaped。)

1

2つの問題:

  1. あなたはthe let-in clausein一部が欠落している(参照してください(と受け入れる)@ephemient's answer

  2. あなたはthe if-then-else clause

  3. then一部が欠落しています

そうですね、ただ、マークの答えに私のコメントを実証する

import IO import System(getArgs) 

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

おかげでたくさん! – sentinel

+7

'do'の中には' let'の後に 'in'は必要ありません。 'do'のインデントに戻ります。 http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14を参照してください。 – ephemient