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