2016-10-23 18 views
0

정수 및 함수를 동시에 포함 할 수있는 변형 (또는 다른 항목)을 사용하여 목록을 정의 할 수 있습니까? 필자는 특히 함수와 일부 다른 유형을 목록에 혼합하는 데 관심이 있습니다.Ocaml의 변형 및 목록

마찬가지로 숫자 또는 함수를 반환 할 수있는 함수를 만들 수 있습니까? 가능한 경우 두 경우의 코드 예제를 제공하십시오.

답변

1
type my_elt = 
    | Null 
    | Int of int 
    | Fun1 of (int-> unit) 
    | Fun2 of (int-> int) 

let eval a =function 
    | Fun1 f -> f a;Null 
    | Fun2 f -> Int (f a) 
    | _  -> Null 

let leval a l = List.map (fun elt -> eval a elt) l 
;; 

테스트 :

물론
let l=[Int 2;Fun1 (Printf.printf "%d");Fun2 ((+)2) ] 
# leval 2 l;; 
2- : my_elt list = [Null; Null; Int 4] 
+0

무슨 일이 일어나고 있는지에 대한 약간의 설명은 분명히 대답을 더욱 도움이 될 것입니다. –

0

, 모두 OCaml이 가능합니다.

표현식을 2 개 (또는 다른 유형)의 값으로 평가할 수있게하려면이 모든 유형을 포함하는 새로운 유형을 작성하려는 것입니다. 유형을 집합과 비교할 수 있다는 점을 상기하십시오. 따라서 유형이 t1t2 인 새로운 유형 t을 정의하려는 경우 합집합이 있어야합니다. 유형이 t1t2이 서로 다른 속성을 가지고 있기 때문에 나중에 구분할 수있는 능력이 있으므로 당연히 조합을 차별화해야합니다. OCaml의가 있는지, 어떻게 내장 차별 노동 조합에 대한 지원 - 변형, 예를 들어,

type t = T1 of t1 | T2 of t2 

이 유형의 정의는 그 종류 t1t2의 차별 조합이다, 새로운 유형을 작성합니다. 정의는 자연스럽게 투영 및 주입 기능을 생성합니다. t1 유형의 값 xt 유형에 삽입하려면 을 입력하십시오 (t2의 값 x에 해당하는 경우 T2 x을 사용하십시오). 패턴 일치를 사용하여 t 유형의 값 yt1 또는 t2 중 하나 (예 : match y with T1 -> ... | T2 -> ...)로 투영하십시오.