2014-07-21 3 views
3

저는 하스켈을 처음 접하고 Arrow tutorial을 읽었습니다. 나는 하스켈이 loop 기능을 평가하는 방법을 이해 할 수 없습니다하스켈에서 게으른 포워드 참조

line (A)에서
newtype Circuit a b = Circuit { unCircuit :: a -> (Circuit a b, b) } 
instance ArrowLoop Circuit where 
    loop (Circuit cir) = Circuit $ \b -> 
     let (cir', (c,d)) = cir (b,d) -- line (A) 
     in (loop cir', c) 

, 변수 d이 초기화되기 전에 사용된다. 어떻게 가능합니까? GHC는 고정 소수점 계산을 수행합니까?

+0

이것은 고전적인 Haskell fibonacci 함수와 비슷합니다 :'let fibs = 0 : 1 : zipWith (+) fibs (tail fibs)'. 여기서 fibs는 자체 정의에서 사용됩니다. 다른 언어에서는 종종 재귀 함수에서만 수행 할 수 있으며 포인터는 명시 적으로 사용하지 않고 값을 자체 재귀 적으로 사용할 수 없습니다. – Axman6

답변

9

하스켈의 letwhere 바인딩은 자기 재귀 적입니다. 고정 소수점 계산을 사용하여 정확히 제거 할 수 있습니다. ArrowLoop은 정확히 자기 자신을 접을 수있는 함수를 모델링하기 때문에이 자체 재귀를 사용해야 할 필요가 있습니다.

항상 그렇듯이 자체 재귀는 충분히 느슨하게 평가되어 생산성을 발휘할 수없는 경우 종료되지 않을 수 있습니다.