이틀리페

Iteratee

기능 프로그래밍에서, 반복순전히 기능적인 방식으로 순차적으로 제시된 입력 데이터의 덩어리를 점진적으로 처리하기 위한 복합적인 추상화다.반복을 사용하면, 예를 들어, 입력의 각 청크를 검색될 때 대문자로 변환하거나 전체 입력 데이터를 메모리에 로드하지 않고 5개의 첫 번째 청크로만 데이터를 제한함으로써, 자원이 데이터를 방출하는 방법을 느리게 변환할 수 있다.반복자는 또한 자원 개방과 폐쇄를 담당하며 예측 가능한 자원 관리를 제공한다.

각 단계에서 반복에는 다음 데이터 청크, 사용할 수 없음을 나타내는 값 또는 반복 프로세스가 완료되었음을 나타내는 값의 세 가지 유형의 값 중 하나가 제시된다.그것은 통화자에게 다음에 무엇을 해야 하는지 지시하기 위해 가능한 세 가지 유형의 값 중 하나를 반환할 수 있다: "정지"(그리고 최종 반환 값을 포함), "계속"을 의미하는 값(그리고 계속하는 방법을 명시), 그리고 "오류 서명"을 의미하는 값이다.후자의 유형의 값은 실제로 반복수의 가능한 "상태"를 나타낸다.반복은 일반적으로 "계속" 상태에서 시작한다.

리플레스는 하스켈스칼라(Play[1] Framework와 스칼라즈)에서 사용되며 F#[2]에서도 사용할 수 있다.여러 가지 조금씩 다른 반복의 구현이 존재한다.예를 들어, 플레이 프레임워크에서는 비동기 처리가 수행될 수 있도록 퓨처스를 포함한다.

반복은 데이터를 제공하는 다른 코드에 의해 호출되기 때문에 제어 역전의 예다.그러나, SXX XML 구문 분석과 같은 제어 역전의 다른 많은 예와 달리, 이 반복은 프로세스에 대한 제한된 제어량을 유지한다.(그 데이터를 내부에 저장하지 않는 한) 이전 데이터를 되돌리고 볼 수는 없지만 예외를 두지 않고 프로세스를 깨끗하게 중지할 수 있다(예외를 예외적인 사건을 신호하기보다는 제어 흐름의 수단으로 사용하는 것은[3] 프로그래머에 의해 종종 눈살을 찌푸리게 된다).

일반적으로 연관된 추상화

다음과 같은 추상화는 반복적인 사람들과 일하기 위해 엄격하게 말할 필요는 없지만, 그것들은 그것을 더 편리하게 해준다.

열거자

Enumerator는 임의의 데이터 소스에서 반복적으로 데이터를 공급하기 위한 편리한 추상화다.일반적으로 열거자는 데이터 소스와 관련된 필요한 자원 정리를 처리한다.열거자는 반복자가 데이터 읽기를 언제 완료했는지 정확히 알기 때문에, 너무 이르거나 너무 늦지 않게 정확하게 적절한 시간에 자원 정리(파일 닫기 등)를 할 것이다.그러나, 그것은 반복자의 구현에 대해 알 필요도 없고, 공동으로 배치될 필요도 없이 이 작업을 수행할 수 있기 때문에 열거자와 반복자는 우려의 분리의 예를 형성한다.

열거

Enumere는 Enumerator 또는 Iterminate의 출력을 변환하고 해당 출력을 Iterminate에 공급하기 위한 편리한 추상화다.예를 들어, "맵" 열거자는 각 입력 청크에 대해 함수를 매핑한다.[4]

동기부여

기존 순수 기능적 해결책의 문제 때문에 입출력 복합화 문제를 정확하게 만드는 문제로 인해 반복실험이 만들어졌다.Haskell의 게으른 I/O는 메모리 매핑된 파일 기능의 일종인 파일을 연 후 I/O를 전혀 명시적으로 수행하지 않고 디스크의 데이터에서 순수 기능이 작동하도록 허용했지만, 런타임에서 파일 또는 기타 리소스가 여전히 필요한지 여부를 알 수 없기 때문에 초과,ve의 파일 수가 불필요하게 열려 운영 체제 수준에서 파일 설명자가 소진될 수 있다.반면 기존의 C형 I/O는 수준이 너무 낮았고 개발자가 파일의 현재 위치와 같은 낮은 수준의 세부 사항에 관심을 가져야 해 컴포지션을 방해했다.반복측정기와 열거자는 게으른 I/O의 높은 수준의 기능적 프로그래밍 편익과 필요한 경우 C-style I/O가 제공하는 낮은 수준의 세부 정보를 결합한다.[5]

사용하다

반복은 재생 프레임워크에서 데이터를 장기간 실행 중인 CometWebSocket 연결로 밀어내기 위해 사용된다.

반복실험은 JSON의 예로서 증분 파싱(즉, 모든 데이터를 한 번에 메모리로 읽지 않는 파싱)을 수행하는 데도 사용할 수 있다.[6]

그러나 반복은 매우 일반적인 추상화로서 임의의 종류의 순차 정보 처리(또는 혼합 순차/랜덤 액세스 처리)에 사용될 수 있으며 입출력이 전혀 필요하지 않다는 점에 유의해야 한다.따라서 네트워크에서 유입되는 데이터 대신 메모리 내 데이터셋에서 작업할 수 있도록 반복 데이터를 쉽게 용도 변경할 수 있다.

역사

어떤 의미에서 열거자가 하나 이상의 반복자의 체인으로 데이터를 밀어넣는 개념의 먼 전신은 운영체제에서의 파이프라인 개념이었다.그러나, 일반적인 파이프라인과 달리, 반복은 서로 메시지를 보내는 일련의 작업자 쓰레드와 유사한 방식으로 작업을 수행할 수 있지만, 별도의 프로세스(따라서 IPC의 오버헤드가 없다) 또는 심지어 별도의 쓰레드가 아니다.이것은 반복이 프로세스나 스레드보다 더 가볍다는 것을 의미한다. 별도의 프로세스나 스레드가 있는 상황과 달리 별도의 스택이 필요하지 않다.

Itreles와 열거자는 Oleg Kiseyov에 의해 하스켈에서 사용하기 위해 발명되었다.[5]이후 스칼라즈(버전 5.0에서, 열거자가 빠져서 스칼라즈 7에서 도입)와 플레이 프레임워크 2.0에 도입되었다.

형식 의미론

반복실험은 형식적으로 자유로운 모나드로 모델링되어 평준화 법률의 유효성을 입증하고, 반복실험을 사용하는 프로그램을 최적화하기 위해 채택되었다.[5]

대안

  • 스칼라에서는 반복기 대신 반복기를 사용할 수도 있지만, 필수적이기 때문에 순전히 기능적인 해결책은 아니다.
  • 하스켈에서는 도관과 파이프로 알려진 두 가지 대안적 추상화가 개발되었다.(이러한 파이프는 운영 체제 수준의 파이프가 아니므로 반복과 마찬가지로 시스템 호출을 사용할 필요가 없다.)특히 도관은 반복보다 훨씬 더 풍부한 원시 요소 및 결합기 라이브러리와 연관되어 있다; HTML, XML, 일반화된 구문 분석, HTTP 요청 작성 및 응답 처리와 같은 증분 기능을 위한 배선 어댑터가 존재하여 산업 소프트웨어 구현에 대한 반복보다 도관이 더 적합하다.하스켈에 있는 oppion, out of the box.
  • 고급 추상화 명명 기계도 있다.스칼라에는 FS2: Functional Streams for Scala라는 패키지가 있는데, 이 패키지의 조상은 여러 포트, 명칭 변경 및 리팩터를 통해 기계로 거슬러 올라갈 수 있다.
  • 하스켈에는 safe-lazy-io 패키지가 존재한다.그것은 일부 동일한 문제에 대한 더 간단한 해결책을 제공하며, 이는 근본적으로 필요한 모든 데이터를 완료 시 자원 정리를 담당하는 파이프라인을 통해 끌어낼 수 있을 만큼 충분히 엄격해야 하는 것을 포함한다.

참조

  1. ^ "Handling data streams reactively". Play Framework documentation. Retrieved 29 June 2013.
  2. ^ "Github Search Results: Iteratee in FSharpx".
  3. ^ "Java theory and practice: The exceptions debate". IBM developerWorks. Retrieved 17 May 2014.
  4. ^ "Enumeratees". Play framework documentation. Retrieved 29 June 2013.
  5. ^ a b c Kiselyov, O. (2012). "Iteratees". Functional and Logic Programming. Lecture Notes in Computer Science. Vol. 7294. pp. 166–181. doi:10.1007/978-3-642-29822-6_15. ISBN 978-3-642-29821-9.
  6. ^ James Roper (10 December 2012). "Json.scala". play-iteratees-extras. Retrieved 29 June 2013.

추가 읽기

외부 링크