2011-07-05 7 views
6

나는 F #을 많이 사용합니다. F #의 모든 기본 콜렉션은 IEumberable 인터페이스를 구현하므로 F #에서 단일 Seq 모듈을 사용하여 액세스하는 것은 자연스러운 일입니다. OCaml에서 가능합니까?IEnumerable <T> in OCaml

다른 질문은 F #에서 'a seq이 게으른 것입니다. 좀 더 자세하게 {1..100} 이상을 사용 1001에서 시퀀스를 만들 수 있습니다

를 OCaml에서
seq { for i=1 to 100 do yield i } 

, 내가 찾을 자신이이 기능을 해결하려면 다음 두 가지 방법을 사용하여 :

  1. 이 목록을 생성 :

    let rec range a b = 
        if a > b then [] 
        else a :: range (a+1) b;; 
    
  2. 또는 명시 적 재귀 함수에 의지하십시오.

첫 번째는 추가 목록을 생성합니다. 두 번째는 mapfold과 같은 고차 함수를 사용하여 시퀀스 수준에서 작동해야하므로 추상화를 중단합니다.

OCaml 라이브러리에는 Stream 모듈이 있다는 것을 알고 있습니다. 그러나 그것의 기능은 F #에서 'a seq만큼 일반적이지 않은 것처럼 보입니다.

나는 최근에 OCaml을 사용하여 프로젝트 오일러 문제를 재생하고 있습니다. 그래서 몇 가지 시퀀스 연산이 있습니다. 명령형 언어는 복잡한 몸체를 가진 루프 일 것입니다.

+0

귀하의 두 번째 질문에 대한 귀하의 유일한 옵션은 그렇게 할 자신의 함수를 만드는 것입니다 생각합니다. 비록 당신이 꼬리 재귀 있는지 확인하고 싶지만. –

답변

0

게으른 목록과 같은 것을 찾는 것 같습니다. 체크 아웃 SO question

5

이 Ocaml 라이브러리는 사용자가 원하는 것을 제공하는 것 같습니다. 나는 그것을 사용하지 않았다.

http://batteries.forge.ocamlcore.org/

체크 아웃이 모듈, 열거 http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/api/Enum.html

어떻게 든 열거을 느낄 서열보다 훨씬 더 좋은 이름입니다. 그것은 Seqs에 소문자/대문자 혼란을 제거합니다. 당신이 항목을 통과 할 때까지

# 1 -- 100;; 
- : int BatEnum.t = <abstr> 

열거 형은 평가되지 않습니다, 그래서 두 번째 요청에 유사한 기능을 제공 : (-) 연산자 배터리 라이브러리도 언급

+0

감사! 이것이 제가 두 번째 질문에 대해 원하는 것입니다. –

+0

배터리 열거 형은이 문제의 표준 솔루션입니다. OCaml의 스트림 모듈은 스트림 파서를 사용하지 않는 한 사용해서는 안됩니다. 배터리에는 시퀀스 및 지연 목록이 있으며 구현 및 의미가 다소 다릅니다. –

0

은을 제공합니다. 배터리의 enum은 변경할 수 있습니다. 이상적으로는 모든 데이터 구조가 변환 될 수있는 지연 목록 구현이 있지만 작업이 아직 완료되지 않았을 것입니다.

1

기능 프로그래밍 각도에서 볼 때 열거자는 정확히 fold 함수입니다. 클래스가 객체 지향 데이터 구조 라이브러리에 Enumerable 인터페이스를 구현하는 경우 유형은 기능적 데이터 구조 라이브러리에 fold 함수와 함께 제공됩니다.

Stream은 다소 기발한 명령형 지연 목록입니다 (요소를 읽는 것이 파괴적이라는 점에서 필수적 임).CamlP5는 기능적 지연 목록 라이브러리 Fstream과 함께 제공됩니다. This already cited thread offers some alternatives.

+0

'스트림'이 '게으른'것 같지 않습니다. 나에게 게으른 것은 온 디맨드뿐만 아니라 결과가 한 번 기록 된 것을 의미합니다. –