Синтаксис Haskell для выражения case в блоке do - PullRequest
23 голосов
/ 01 октября 2008

Я не могу понять эту синтаксическую проблему с выражением 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. Если у вас возникли проблемы, проверьте наличие табуляции и пробелов в исходном коде.

Ответы [ 2 ]

28 голосов
/ 01 октября 2008

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"

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

11 голосов
/ 01 октября 2008

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

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

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

...