2010-12-01 7 views
0

Le code suivant:Parse error dans Haskell

import IO 
import System(getArgs) 

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

génère une erreur d'analyse syntaxique de la clause if-else. J'ai essayé d'utiliser des accolades en vain. Aide!

Répondre

5

Juste pour démontrer mon commentaire à la réponse de Marc,

import System.Environment (getArgs) 

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

est Haskell juridique.


Avec l'extension {-# LANGUAGE RebindableSyntax #-} de GHC 7.0, vous pouvez même sortir avec

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" 

(Shamelessly singé de blog.n-sch.de.)

1

Deux questions:

  1. vous manque la partie in de the let-in clause (voir (et accepter) @ephemient's answer)

  2. vous manque la partie then de the if-then-else clause

Cela pourrait ressembler à ceci:

import IO import System(getArgs) 

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

Merci un bouquet! – sentinel

+7

A l'intérieur d'un 'do', vous n'avez pas besoin de' in' après un 'let'; il suffit de revenir à l'indentation 'do'. Voir http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14 – ephemient

Questions connexes