2015-01-14 3 views
2

Я изучаю Хаскелл. Мой код:Почему я получаю сообщение об отсутствии исключений?

main = do 
    args <- getArgs 
    if length args < 2 then 
    putStrLn invalidCallingSignature 
    else 
    dispatch fileName command commandArgs 
    where (fileName : command : commandArgs) = args -- But I get an Exception: src3.hs:22:48: Not in scope: `args' 

Я смущен исключением Я получаю для последней строки кода. Почему я понял?

ответ

7

Пункт where применяется к функции в целом, а отступ вводит вас в заблуждение. То, что компилятор видит:

main = do 
    args <- getArgs 
    if length args < 2 then 
     putStrLn invalidCallingSignature 
    else 
     dispatch fileName command commandArgs 
    where (fileName : command : commandArgs) = args 

Так args не видно. Вы хотите делать нотацию let:

main = do 
    args <- getArgs 
    if length args < 2 then 
     putStrLn invalidCallingSignature 
    else do 
     let (fileName : command : commandArgs) = args 
     dispatch fileName command commandArgs 
+3

Случая заявление может быть симпатичнее здесь: 'случай аргом из {FileName: команда: commandArgs -> командного commandArgs отправки FileName; _ -> putStrLn invalidCallingSignature} ', но это действительно вопрос личных предпочтений. Операция case будет означать, что перехват списка для поиска длины не понадобился бы. – bheklilr

+0

Добавьте 'do' после' else' или, наоборот, 'in' after' = args'. – chi

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