Подтвердить что ты не робот

Синтаксис Haskell для выражения case в блоке do

Я не могу понять эту проблему синтаксиса с выражением case в блоке do.

Каков правильный синтаксис?

Если бы вы могли исправить мой пример и объяснить, что это будет лучше.

module Main where 

main = do   
     putStrLn "This is a test"
     s <- foo
     putStrLn s  

foo = do
    args <- getArgs 
    return case args of
                [] -> "No Args"
                [s]-> "Some Args"

Небольшое обновление. Мой исходный файл представлял собой сочетание пробелов и вкладок, и это вызывало всевозможные проблемы. Просто подсказка для любого другого, начинающегося в Haskell. Если у вас возникли проблемы с проверкой вкладок и пробелов в исходном коде.

4b9b3361

Ответ 1

return - это (перегруженная) функция, и она не ожидает, что ее первым аргументом будет ключевое слово. Вы можете либо заключить в скобки:

module Main where 
import System(getArgs)

main = do   
     putStrLn "This is a test"
     s <- foo
     putStrLn s  

foo = do
    args <- getArgs 
    return (case args of
                [] -> "No Args"
                [s]-> "Some Args")

или используйте удобный оператор приложения ($):

foo = do
    args <- getArgs 
    return $ case args of
                [] -> "No Args"
                [s]-> "Some Args"

По стилю, я разделил бы его на другую функцию:

foo = do
    args <- getArgs 
    return (has_args args)

has_args [] = "No Args"
has_args _  = "Some Args"

но вам все равно нужно заключить в скобки или использовать ($), потому что возврат принимает один аргумент, а приложение-функция - наивысшее приоритет.

Ответ 2

Эквивалентное:

foo = do
  args <- getArgs 
  case args of
        [] -> return "No Args"
        [s]-> return "Some Args"

Возможно, предпочтительнее делать то, что предлагает wnoise, но это может помочь кому-то понять немного лучше.