2010-12-01 3 views
0

следующий код:Ошибка синтаксического анализа в Haskell

import IO 
import System(getArgs) 

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

генерирует ошибку синтаксического анализа для IF-то еще п. Я пробовал использовать фигурные скобки безрезультатно. Помощь!

ответ

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.


С {-# LANGUAGE RebindableSyntax #-} расширением GHC 7.0, вы можете даже уйти с

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.)

1

Два вопроса:

  1. Вы упускаете in часть the let-in clause (см (и принять) @ephemient's answer)

  2. Вы упускаете then часть the if-then-else clause

Таким образом, это может выглядеть так:

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 2010-12-01 02:32:39

Смежные вопросы