2013-10-20 3 views
10

OCaml에서 cons 연산자를 단독으로 참조 할 수있는 방법이 있습니까? (::) 같은 결과를 생성 할 수있는 방법이 있나요OCaml cons (: :) 연산자?

# (+) 3 5;; 
- : int = 8 
# (*) 4 6;; 
- : int = 24 
# (::) 1 [2;3;4];; 
Error: Syntax error: operator expected. 

:

예를 들어, 나는 (+)(*)int -> int -> int 등의 기능을 사용할 수 있지만, 나는 다음과 같은 예를 들어, 쇼 등의 'a -> 'a list -> 'a list 함수로 (::)을 사용할 수 없습니다 fun x y -> x::y 이외의 문자? 그리고 누구도 왜 (::)가 OCaml에서 구현되지 않았는지 알고 있습니까?

+0

인수를 괄호로 묶으면 다음과 같이 작동합니다.'(: :) (; 1 : [2; 3; 4]) ;; –

답변

9

아니요 단점 :(:)은 생성자이므로 생성자는 삽입 연산자 일 수 없습니다. 허용되는 중위 기호는 여기에 있습니다 : (당신이 언급으로) http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html

일부 해결

let (+:) x l = x :: l 
+0

참고로 지식은 [http : // caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html#toc50] 섹션 변형. – Gqqnbig

13

가에 추가하기 자세한

(fun x l -> x :: l) 

및 정의 자신의 비 전통적인 중위 단점입니다 @seanmcl의 답변,

사실 :) :

# (::)(1, []);; 
- : int list = [1] 

이 모든 OCaml의 변이체 생성자 카레되지 않고 부분적으로 적용 할 수 없다는 사실에 대응하는 uncurried 형태를 OCaml은 (접두사 형태를 지원한다. 이것은 (: :)에 대한 특수 구문 분석 규칙에 의해 처리됩니다. 따라서 이상한 오류 메시지 Error: Syntax error: operator expected.이 발생합니다.

업데이트 :

다가오는 OCaml의 4.02는이 구문 분석 규칙을 삭제합니다 때문에이 더 이상 사용할 수 없습니다.