Выполнение строки чтения внутри if


Я пишу небольшую утилиту командной строки в Haskell, которая должна принимать команду с необязательным аргументом командной строки - но если аргумент отсутствует, пользователю должно быть предложено ввести его*. Например:

$ my_prog add item_name
Adding... done

$ my_prog add
Enter item name: item_name
Adding... done

Моя первая попытка выглядела примерно так:

add args = do
    let id = if length args > 0
        then head args
        else input where
            input <- readLine
    -- Do stuff with id
    putStrLn id

, который не удается разобрать в <-.

С тех пор я решил, что это глупая идея, но я подумал, что все равно задам этот вопрос.
1 3

1 ответ:

Вы пытаетесь использовать do-нотацию внутри if, это не сработает (и, кроме того, не будет проверять тип, так как вся if находится вне IO монады).

add args = do
    id <- if length args > 0
              then return $ head args
              else readLine
    putStrLn id