2008-11-06 2 views
18

파이썬에서 map()은 시퀀스 프로토콜을 따르는 모든 데이터에서 작동합니다. 문자열이나리스트 또는 튜플을 제공하는지 여부에 관계없이 The Right Thing^TM을 수행합니다.OCaml은 일반적인 map()/reduce() 함수를 가지고 있습니까?

내 케이크도 OCaml에 넣을 수 없습니까? 다른 선택의 여지가 없지만 사용중인 컬렉션 유형을보고 해당 List.map 또는 Array.map 또는 Buffer.map 또는 String.map을 찾으십니까? 이들 중 일부는 존재하지도 않습니다! 나는 이상한 것을 요구하고 있는가? 나는 뭔가를 놓치고 있어야합니다.

+0

문서를보고 적절한 기능을 사용해야하는 것이 정확히 잘못 되었습니까? –

답변

17

Enum의 모듈은 OCaml Batteries Included (이전은 Extlib)입니다. Enum은지도를 정의하고 Enum.t을 접습니다. 데이터 유형에 대해 Enum.t에서 /로 변환을 사용해야합니다. Enum.t은 게으르기 때문에 변환은 상당히 가벼울 수 있습니다.

하스켈 스타일 type classesFoldableFunctor (일반 "맵")과 같이 원하는 것입니다. Haskell 라이브러리는리스트, 배열, 트리에 대해 FoldableFunctor의 인스턴스를 정의합니다. 또 다른 관련 기술은 일반 프로그래밍에 "Scrap Your Boilerplate" approach입니다. OCaml은 타입 클래스 또는 higher-kinded polymorphism을 지원하지 않기 때문에, 타입 시스템에서 이와 같은 패턴을 표현할 수 없을 것이라고 생각합니다.

+0

ML에서는 고차원 모듈 시스템이이 문제를 해결합니다. –

+0

필자는 functor에서 모든 것을 래핑하는 것이이 문제에 대한 "해결책"이라고 동의하지 않습니다. –

+0

사실에 동의하지 않습니다.OCaml의 솔루션이이 문맥에서 클래스를 입력하는 것이 바람직한 이유를 설명하는 많은 예제와 비교를 위해 Okasaki의 책을 살펴보십시오. –

1

문제는 각 컨테이너마다 표현이 다르므로 반복 할 때 map/reduce에 다른 코드가 필요하다는 것입니다. 이것이 별도의 기능이있는 이유입니다. 대부분의 언어는 컨테이너에 대한 일종의 일반적인 인터페이스 (예 : 언급 한 시퀀스 프로토콜)를 제공하므로 map/reduce와 같은 함수를 추상적으로 구현할 수 있지만 언급 한 유형에서는 수행되지 않습니다.

-3

모듈에서 t 및 val compare (: t-> t-> int) 유형을 정의하면 Map.Make가 원하는 맵을 제공합니다.

10

OCaml의에서 두 가지 해결책이 있습니다 : 자크 Garrigue 이미 몇 년 전에 많은 데이터 구조에 대한 구문 빛하지만 비효율적 인 접근 방식을 구현

  1. . map 메서드를 제공하는 객체로 컬렉션을 래핑하면됩니다. 그런 다음 collection#map을 사용하여 모든 종류의 컬렉션에 대해 맵 기능을 사용할 수 있습니다. 이는 런타임에에서 다른 종류의 데이터 구조를 으로 대체 할 수 있기 때문에 요구 사항보다 더 일반적입니다. 그러나 실제로는 그렇게 유용하지 않으므로 접근 방법이 널리 채택되지 않았습니다.

  2. 구문 상으로 무겁지만 효과적이고 강력하고 정적 인 솔루션은 펑터를 사용하여 사용중인 데이터 구조에 대해 코드를 매개 변수화하는 것입니다. 이렇게하면 다른 데이터 구조로 코드를 재사용하는 것이 쉽습니다. Okusaki의 저서 "Purely Functional Data Structures"의 Markus Mottl 's OCaml 번역에서 좋은 예제를 볼 수있다. 당신은 그런 능력을 찾고 바로 그때, 물론, 당신은 단지 짧은 이름을 가진 모듈 별명 (예를 들어, 모듈 S = 문자열)을 만들 수 있습니다 간결함을 원하지하는

합니다.

관련 문제