2008-10-01 2 views
20

do 블록의 case 식으로이 구문 문제를 파악할 수 없습니다.do 블록의 case 식에 대한 하스켈 구문

올바른 구문은 무엇입니까?

내 예제를 수정하고 설명하면 가장 좋을 것입니다.

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" 

약간의 업데이트. 내 소스 파일은 공백과 탭이 혼합되어있어 모든 종류의 문제를 일으켰습니다. 하스켈에서 시작하는 다른 사람들을위한 팁. 문제가있는 경우 소스 코드에서 탭과 공백을 확인하십시오.

답변

25

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 (has_args args) 

has_args [] = "No Args" 
has_args _ = "Some Args" 

있지만 :

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

Stylewise, 내가 다른 함수로 그것을 깰 줄을 당신은 괄호로 묶다 중 하나를 수 반환은 하나의 인수를 취하고 함수 응용 프로그램이 가장 높은 우선 순위이므로 괄호로 묶거나 사용 ($)해야합니다. 동등하게

+0

나는 두 가지 옵션을 모두 시도해 보았습니다. 질문을 보내기 전에. 어리석은 나를. 감사합니다. – Ted

10

:

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

그것은 wnoise에서 알 수 있듯이 할 아마도 바람직하지만이 사람이 조금 더 잘 이해 도움이 될 수 있습니다.

+0

이 방법은 IO 작업의 일류 성격을 잘 강조합니다. – wnoise