2014-02-14 6 views
1

OCaml 언어 용 코어 라이브러리는 매우 유용한 맵 및 테이블 모듈과 함께 제공됩니다. 다형성과 함께 사용자 지정지도 비교코어 라이브러리를 사용하여 ocaml에서 맵 유형 정의

type mytype = int String.Map.t (* A mapping from strings to integers *) 

가 나는 또한 정의하는 방법을 알고 :

type mytype = (string, string) Map.Poly.t (* A map from strings to strings *) 

은 내가 몇 가지 기본 유형에서지도를 사용하려면 내 자신의 유형을 정의하는 방법을 알고 내가 알지 못하는 것은 비 다형성 (non-polymorphic)을 사용하여 커스텀 맵을 정의하는 법이다. 예. 내가

type row_t = Row of int 
type column_t = Column of int 
(* I want a map from rows to columns *) 
type mymap_t = (row_t, column_t, ???) Map.t 

이 있다고 가정 나는 세 번째 인수는 비교해야 이해, 아직 내가 안으로 넣어 모르는 : Int.comparatorInt.comparator_witness 모두가 원하는 결과를 제공하지 못한다.

+0

합니까 [이 블로그 게시물 (https://ocaml.janestreet.com/?q=node/112)의 도움을. –

답변

1

Ashish가 언급 한 블로그 게시물을 참조 할 수 있습니다.

그러나 Core (Core 구문 확장 덕분에)를 사용할 때 사용자 지정 구조에 대한 Maps 및 Sets를 생성하는 방법이 더 "자동"방법을 선호합니다. 더

type t = T.t = Row of int 
... 
val (>) : T.t -> T.t -> bool = <fun> (* compare functions *) 
val (<) : T.t -> T.t -> bool = <fun> 
val equal : T.t -> T.t -> bool = <fun> 
val compare : T.t -> T.t -> int = <fun> 
val min : T.t -> T.t -> T.t = <fun> 
val max : T.t -> T.t -> T.t = <fun> 
... 
module Map : (* non-polymorphic Map module *) 
... 
end 
module Set : (* non-polymorphic Set module *) 
... 
end 

을하고 많은 :

module T = struct 
    type t = Row of int 
    with sexp, compare 
end 
include T 
include Comparable.Make(T) 

그래서이 모든 비교 기능 (및 기타 유용한 기능) 및 기본 데이터 구조는 일반적으로 필요 생성 : 여기

작은 예입니다 . 그래서 기본적으로 당신은 이후에 비 다형성지도를 사용할 수 있습니다

type column_t = Column of int 
let map = Map.singleton (Row 1) (Column 2) 
+0

와우, 고마워! 'Comparable.Make (T)'는 실제로 비교 자 (Comparator)가 아닌'Set','Map'과 다른 모든 계열을 만들어내는 것이 놀랍습니다. –