Вопрос

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

Это было полезно?

Решение

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 имеет наивысший приоритет.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top