2017-10-20 7 views
1

: 나는 BuckleScript FFI manual을 읽는 동안이 우연히빈 유형 선언 한 아무것도에 바인딩하지 않고 유형을 선언하면 어떻게됩니까

type a_type 
type b_type 

let a : a_type = (* ? *) 

. JS 객체에 바인딩에 대한 코드는 다음과 같다 :

type t 
external create_date : unit -> t = "Date" [@@bs.new] 
let date = create_date() 

BuckleScript의 특이성 곁에 t 그것은 일반적인 외부 JS 타입 다형성 형태로 동작처럼,이 경우에 보이는 유효한 형태로 사용된다.

나는 그런 초보적인 질문을하는 것에 사과해야한다. 그러나 이것들은 내가 조사 해본 곳 어디에도 기록되어 있지 않다. 모든 포인터는 감사하겠습니다.

답변

2

이것은 abstract type이라고하며 일반적으로 기본 데이터의 구조를 숨기는 데 사용되지만 기본 JavaScript 구조가 반드시 기본 OCaml 유형으로 표현할 수 없기 때문에 특히 BuckleScript에서 유용합니다.

다형성이 아니지만 단지 불투명 한 유형입니다.

FFI의 본질은 개념을 약간 복잡하게 만들 수 있습니다. 외부 "함수"는 정의에 따라 형식이 지정되지 않으며 external을 사용하여 FFI를 정의하는 프로세스는 컴파일러에게 이러한 함수의 유형을 알려주는 것입니다. 따라서 컴파일러에게 toString이 원하는 경우 int을 반환한다고 말할 수 있습니다. 실제로는 int으로 사용하려고 시도 할 때까지 그 차이를 알 수 없으므로 물론 끝내지 않을 것입니다.

그러나 추상적 유형은 사용자 정의이며 구조가 없으므로 FFI를 통해 직접 조작 할 수있는 모든 기능을 정의해야합니다. OCaml에서 (최소한 타입 시스템을 우회하지 않는 한) 조작 할 수 없으므로 하나의 FFI 함수에서 다른 FFI 함수로 값을 전달할 수있는 블랙 박스 일뿐입니다.

+0

그래서 기본적으로 Js 유형은 추상적입니다 (Js 객체는 동적이기 때문에). – PieOhPah

+0

일반적으로 모든 유형이 가능합니다. 'Js.Json.t'은 예를 들어 Json 타입이 될 수 있지만 추상 타입은 JSON에 바인딩 할 때와 같이 아직 알지 못하거나 알고 싶지 않을 때 유용합니다. 구문 분석 '. [DOM] (https://github.com/BuckleScript/bucklescript/blob/master/jscomp/others/dom.mli)의 유형 계층 구조를 정의하는 것과 같이 훨씬 더 미친 짓을 할 수도 있습니다. – glennsl

관련 문제