우선, 우리는 아름다운 정의를 가지고 있습니다.
x = 1 : map (2*) x
전에 본 적이 없다면 그 자체로 약간의 마음을 구부릴 수 있습니다. 어쨌든 그것은 게으름과 재귀의 상당히 표준적인 트릭입니다. 이제, fix및 point-free-ify를 사용하여 명시 적 재귀를 제거합니다 .
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
다음으로 할 일은 :섹션을 확장 하고 map불필요하게 복잡하게 만드는 것 입니다.
x = fix ((:) 1 . (map . (*) . (*2)) 1)
자, 이제 우리는 그 상수의 두 개의 복사본을 가지고 있습니다 1. 그것은 결코 할 수 없으므로 우리는 그것을 중복 제거하기 위해 적용되는 리더기를 사용할 것입니다. 또한 기능 구성은 약간 쓰레기이므로 (<$>)가능한 한 어디로 든 교체합시다 .
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
다음으로이 호출 map은 너무 읽기 쉽습니다. 그러나 두려워 할 것은 없습니다. 모나드 법칙을 사용하여 조금 확장 할 수 있습니다. 특히, fmap f x = x >>= return . f그래서
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
우리는 - 자유 쓸어 포인트 대체 할 수 (.)와 함께 (<$>)다음 몇 가지 가짜 섹션을 추가 :
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
이전 단계에서이 방정식을 대체합니다.
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
마지막으로 스페이스 바를 깨고 멋진 최종 방정식을 생성합니다.
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)