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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top