2013-10-30 3 views
3

나는 조금 혼란 스럽다. Haskell에서 일반적인 재귀 함수를 정의 할 때 아무런 문제가 없다. 동시에 고정 소수점을 통해 재귀 lambda를 정의하는 표준 인 fix이 있습니다. 그러나 덜 읽기 쉬운 것 외에도 이와 같이 정의 된 재귀 람다는 직접 호출하는 일반적인 재귀 함수에 비해 응용 프로그램 오버 헤드가 있습니다. 그래서 실질적으로 어디에서 재귀 람다와 fix이 필요한가요?하스켈에서 재귀 함수 대 재귀 람다

답변

8

절대로 필요하지 않습니다. 가끔은 약간 편리합니다.

foo = do 
    foo1 
    x <- foo2 
    let loop = do 
     y <- bar x 
     if pred y then loop else return y 
    z <- loop 
    foo3 z 

foo = do 
    foo1 
    x <- foo2 
    z <- fix $ \loop -> do 
     y <- bar x 
     if pred y then loop else return y 
    foo3 z 

대 나는 두 번째는 조금 덜 복잡 비트 찾을 수 있습니다. 사소한 일이지만, 이상하게 보입니다 (예를 들어, 예제보다 복잡합니다. 라이브러리에 이미 존재하는 것 같지 않습니다) 모나드 반복 루틴은 저 관용구를 사용하는 것만 큼 가치가 있습니다. 또한 다른 이름을 do 블록의 컨텍스트에 바인딩하는 것을 피하는 것이 좋습니다.