Programing

이 난독 화 된 Haskell 코드는 어떻게 작동합니까?

crosscheck 2020. 9. 9. 07:32
반응형

이 난독 화 된 Haskell 코드는 어떻게 작동합니까?


http://uncyclopedia.wikia.com/wiki/Haskell을 읽는 동안 (그리고 "공격적인"모든 것을 무시하고), 나는 다음과 같은 난독 화 된 코드를 우연히 발견했습니다.

fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1

에서 해당 코드를 실행하면 ghci( Data.Function가져 오기 후 Control.Applicative) ghci2의 모든 거듭 제곱 목록을 인쇄합니다.

이 코드는 어떻게 작동합니까?


우선, 우리는 아름다운 정의를 가지고 있습니다.

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)

최종 코드 (2008 년 초)까지 이어지는 실험에 대한 IRC 로그 전체를 통해 긴 답변을 작성했지만 실수로 모든 텍스트를 작성했습니다. :) 그렇게 큰 손실은 아닙니다. 대부분의 Daniel의 분석이 자리를 잡았습니다.

내가 시작한 것은 다음과 같습니다.

Jan 25 23:47:23 <olsner>        @pl let q = 2 : map (2*) q in q
Jan 25 23:47:23 <lambdabot>     fix ((2 :) . map (2 *))

차이점은 대부분 리팩토링이 발생한 순서로 내려갑니다.

  • 대신 x = 1 : map (2*) xI로 시작 2 : map ..., 나는 내가 압착 맨 마지막 버전 때까지 초기 2 권리를 유지 (*2)하고 변화 $2에 끝 $1. "불필요 할 정도로 복잡한지도 만들기"단계는 발생하지 않았습니다.
  • 나는 liftA2 대신 liftM2를 사용했습니다.
  • 난독 화 된 map함수는 liftM2를 Applicative combinators로 대체하기 전에 삽입되었습니다. 그 때도 모든 공간이 사라졌습니다.
  • 내 "최종"버전에도 .함수 구성 위한 많은 부분 이 남아있었습니다. 그것들을 모두 대체하는 것은 그와 <$>백과 사전 사이의 몇 달 동안 분명히 일어났습니다.

BTW, 더 이상 번호를 언급하지 않는 업데이트 된 버전이 있습니다 2.

fix$(<$>)<$>(:)<*>((<$>((:[{- Jörð -}])<$>))(=<<)<$>(*)<$>(>>=)(+)($))$1

참고 URL : https://stackoverflow.com/questions/12659951/how-does-this-piece-of-obfuscated-haskell-code-work

반응형