이 난독 화 된 Haskell 코드는 어떻게 작동합니까?
http://uncyclopedia.wikia.com/wiki/Haskell을 읽는 동안 (그리고 "공격적인"모든 것을 무시하고), 나는 다음과 같은 난독 화 된 코드를 우연히 발견했습니다.
fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1
에서 해당 코드를 실행하면 ghci
( Data.Function
및 가져 오기 후 Control.Applicative
) ghci
2의 모든 거듭 제곱 목록을 인쇄합니다.
이 코드는 어떻게 작동합니까?
우선, 우리는 아름다운 정의를 가지고 있습니다.
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*) x
I로 시작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
'Programing' 카테고리의 다른 글
"프로시 저는 'ntext / nchar / nvarchar'유형의 '@statement'매개 변수를 예상합니다."라는 메시지가 표시되는 이유는 무엇입니까? (0) | 2020.09.09 |
---|---|
월 및 연도 기준으로 만 mySQL 선택 (0) | 2020.09.09 |
JSONarray를 ArrayList로 변환 (0) | 2020.09.09 |
클라이언트 측에서 양식이 여러 번 제출되는 것을 방지하는 방법은 무엇입니까? (0) | 2020.09.09 |
pandas DataFrame으로 SQLAlchemy ORM 변환 (0) | 2020.09.09 |