Development Tip

Haskell의 Stream Fusion이란?

yourdevel 2020. 11. 18. 21:33
반응형

Haskell의 Stream Fusion이란?


Haskell의 Stream Fusion은 무엇이며 어떻게 사용합니까?


Logan이 지적하는 논문은 훌륭하지만 조금 어렵습니다. (제 학생들에게 물어보세요.) '스트림 퓨전이 작동하는 방식'과 '스트림 퓨전이 무엇이며 어떻게 사용할 수 있는지'에 대한 부분도 중요합니다.

스트림 융합이 해결하는 문제는 작성된 기능 코드가 종종 중간 목록을 할당한다는 것입니다. 예를 들어 무한한 노드 번호 목록을 만들려면

nodenames = map ("n"++) $ map show [1..]

순진한 코드는 무한한 정수 목록 [1, 2, 3, ...], 무한한 문자열 목록 ["1", "2", "3", ...], 그리고 결국 무한한 이름 목록을 할당 합니다 ["n1", "n2", "n3", ...]. 너무 많은 할당입니다.

스트림 퓨전이하는 일은 nodenames결과에 필요한 것만 할당하는 재귀 함수를 사용하는 것으로 정의를 변환하는 것입니다. 일반적으로 중간 목록 할당을 제거하는 것을 삼림 벌채 라고 합니다.

스트림 융합을 사용하려면 명시 적 재귀 대신 GHC 티켓 915 ( , 등)에 설명 된 스트림 융합 라이브러리의 함수 를 사용하는 비 재귀 목록 함수 를 작성해야합니다 . 이 라이브러리에는 스트림 융합을 이용하기 위해 재 작성된 모든 Prelude 함수의 새 버전이 포함되어 있습니다. 분명히이 항목은 다음 GHC 릴리스 (6.12)에 포함될 예정이지만 현재 안정 버전 (6.10)에는 없습니다. 라이브러리를 사용하려는 경우 Porges는 그의 대답에 멋지고 간단한 설명이 있습니다.mapfoldr

실제로 스트림 퓨전이 어떻게 작동하는지에 대한 설명이 필요하면 다른 질문을 게시하세요.하지만 훨씬 더 어렵습니다.


내가 아는 한, Norman이 말한 것과는 달리 스트림 융합은 현재 GHC 기반에서 구현 되지 않습니다 (즉, Prelude 기능을 사용할 수 없음). 자세한 내용은 GHC 티켓 915를 참조하십시오 .

스트림 퓨전을 사용하려면 스트림 퓨전 라이브러리를 설치하고 Data.List.Stream을 가져 와서 (Control.Monad.Stream을 가져올 수도 있음) Prelude 함수가 아닌 해당 모듈의 함수 만 사용해야합니다. 즉, [x..y] 구문이나 목록 이해를 사용하지 않고 모든 기본 목록 함수를 숨기는 Prelude를 가져옵니다.


6.12의 GHC가 기본적으로 새 함수를 사용할 때 [x..y]를 구현하고 비 재귀적인 방식으로 이해를 나열한다는 것이 맞지 않습니까? 그들이 올바른 행이 아닌 유일한 이유는 내부적 이며 실제로 Haskell로 작성되지 않았기 때문입니다. 그러나 속도와 / 또는 해당 구문을 재정의 할 수 없기 때문에 키워드와 더 비슷하기 때문입니다.

참고 URL : https://stackoverflow.com/questions/578063/what-is-haskells-stream-fusion

반응형