2016-09-10 9 views
0

c이 유효하지 않고 두 번째 종료시 왜 종료되지 않는지 이해하려고합니다. 설명에서 here main은 단지 평가되지 않은 썽크이며, executing은 단지 데이터 구조를 구축하고 있습니다. 나는 같은 원리를 여기에 적용하려고 노력하고 있는데 왜 첫 번째 주전자가 끝나지 않는지 보게된다. 누군가 제가이 부분을 이해하도록 도와 주거나 이해에 대한 조언을 주면 위대 할 것입니다. 이 외에도 GHCI는 왜 이것을 TCO로 인식 할 수 없습니까? doesn''t는 정의에 적합하다?Haskell : TCO and Lazy evaluation

main = loop                  
    where                   
    loop = do                 
    c <- getChar                
    case valid c of                
     Nothing -> return()              
     Just b -> print b              
    print c                  
    loop                  

> main :: IO() 
> main = loop 
> where 
> loop = do 
>  c <- getChar 
>  case validate c of 
>  Nothing -> return() 
>  Just b -> do 
>   print b 
>   loop 

감사합니다.

+1

['return'] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad-Instances.html#v:return)은 단지 라이브러리 함수임을 알고 있습니다. 절차 형 언어의'return' 키워드와 아주 다른 방식으로 작동합니까? – leftaroundabout

+0

@leftaroundabout : "POST"를 눌렀을 때 "무언가"가 올바르지 않다는 것을 깨닫고 바로이 주석을 보았습니다. 감사. – user3169543

+0

답변을 수락하는 것 이외의 다른 질문을 '닫을 수 없습니까?' 그렇다면 대답을 받기 전에 언젠가 기다려야합니다. stackoverflow 설명서를 읽습니다. 지금은 동의하려면 7 분 더 기다려야합니다 .--). – user3169543

답변

5

꼬리 호출 최적화에는 이 없습니다.이 동작을 수행하려면이 필요합니다. 문제는 단순히 첫 번째 코드는 무한 루프를 포함하고 두 번째 코드는 포함하지 않는다는 것입니다.

첫 번째 코드는 필수적 유사하다 (파이썬 같은) : 후자의 경우 loop()에 대한 호출이 얼마나

def loop(): 
    c = getChar() 
    if valid c: 
     do_something() 
    else: 
     do_something_else() 
     print(c) 
     loop() 

참고 :

def loop(): 
    c = getChar() 
    if valid c: 
     do_something() 
    else: 
     do_something_else() 

    print(c) 
    loop() 

후자 동안 유사하다 안에 브랜치 else이 있고, 이전에는 바깥에 있으므로, loop 호발시마다 호출됩니다.

또한 하스켈의 return이 아니며은 함수 호출을 종료합니다. 특정 값과 부작용이없는 것은 단지 IO 작업입니다. 예를 들어

:

main = do 
    c <- return 1 
    print c 

상기 코드 return 이어 print의 출력을 차단하지 않는.