sintaxe Haskell para uma expressão case em um bloco de afazeres
Pergunta
Não consigo bastante descobrir este problema de sintaxe com uma expressão case
em um bloco do
.
O que é a sintaxe correta?
Se você pudesse corrigir meu exemplo e explicar que seria o melhor.
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"
Um pouco atualização. Meu arquivo de origem era uma mistura de espaços e tabulações e foi causando todos os tipos de problemas. Apenas uma dica para qualquer partida pessoa em Haskell. Se você está tendo problemas verificar se há guias e espaços em seu código-fonte.
Solução
retorno é uma função (sobrecarregada), e ele não está esperando seu primeiro argumento para ser uma palavra-chave. Você pode ou entre parênteses:
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")
ou usar o operador aplicação acessível ($):
foo = do
args <- getArgs
return $ case args of
[] -> "No Args"
[s]-> "Some Args"
stylewise, eu quebrá-lo em outra função:
foo = do
args <- getArgs
return (has_args args)
has_args [] = "No Args"
has_args _ = "Some Args"
, mas você ainda precisa entre parênteses ou utilização ($), porque o retorno recebe um argumento, e aplicação de função é a mais alta prioridade.
Outras dicas
De forma equivalente:
foo = do
args <- getArgs
case args of
[] -> return "No Args"
[s]-> return "Some Args"
É provavelmente preferível fazer como wnoise sugere, mas isso pode ajudar alguém a entender um pouco melhor.