문제

Python Map ()는 시퀀스 프로토콜을 따르는 모든 데이터에서 작동합니다. 내가 끈이나 목록 또는 튜플을 먹이는지 여부에 관계없이 옳은 일을합니다.

OCAML에 케이크를 먹을 수 없습니까? 내가 사용하는 컬렉션 유형을 살펴보고 해당 목록을 찾거나 Array.Map 또는 Buffer.Map 또는 String.map을 찾으려면 다른 선택이 없습니까? 이들 중 일부는 존재하지 않습니다! 내가 요구하는 것은 드문 일입니까? 나는 뭔가를 놓치고 있어야한다.

도움이 되었습니까?

해결책

당신이 이것에 가장 가까운 것은 모듈입니다 Enum 안에 OCAML 배터리가 포함되어 있습니다 (이전 extlib). Enum 지도와 접기를 정의합니다 Enum.t; 당신은 단지 변환을 사용하거나 Enum.t 데이터 유형의 경우. 변환은 상당히 밝을 수 있습니다 Enum.t 게으르다.

당신이 정말로 원하는 것은 Haskell 스타일입니다 유형 클래스, 처럼 Foldable 그리고 Functor ( "지도"를 일반화합니다). Haskell 라이브러리는 인스턴스를 정의합니다 Foldable 그리고 Functor 목록, 배열 및 나무. 또 다른 관련 기술은입니다 "보일러 플레이트를 긁어 내십시오"접근 방식 일반 프로그래밍에. OCAML은 유형 클래스를 지원하지 않으므로 높은 가게 된 다형성, 나는 당신이 유형 시스템에서 이와 같은 패턴을 표현할 수 있다고 생각하지 않습니다.

다른 팁

OCAML에는 두 가지 주요 솔루션이 있습니다.

  1. Jacques Garrigue는 이미 몇 년 전에 많은 데이터 구조에 대해 구문 적으로 광택이지만 비효율적 인 접근 방식을 구현했습니다. 당신은 그냥 컬렉션을 map 방법. 그런 다음 할 수 있습니다 collection#map 모든 종류의 컬렉션에 맵 기능을 사용합니다. 다양한 종류의 데이터 구조를 대체 할 수 있기 때문에 요구 사항보다 일반적입니다. 런타임에. 그러나 이것은 실제로 유용하지 않으므로 접근 방식이 널리 채택되지 않았습니다.

  2. 구문 적으로 유쾌하지만 효율적이고 강력하며 정적 솔루션은 functors를 사용하여 사용중인 데이터 구조를 통해 코드를 매개 변수화하는 것입니다. 따라서 다른 데이터 구조로 코드를 재사용하는 것이 중요합니다. 몇 가지 훌륭한 예를 보려면 Markus Mottl의 Okasaki의 책 "순수한 기능 데이터 구조"의 OCAML 번역을 참조하십시오.

그런 종류의 힘을 찾고 있지 않고 간결함을 원한다면 물론 짧은 이름 (예 : 모듈 S = String)으로 모듈 별칭 만 만들 수 있습니다.

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

모듈에서 type t 및 val compare (: t-> t-> int)를 정의하는 한 Map.make에서 원하는 맵을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top