2014-04-16 3 views
1

다른 유형의 값을 유형 변환하려고합니다.ocaml에서 값을 유형 변환하는 방법

type days = 
    | Mon | Tue | Wed | Thu | Fri | Sat 

type ('a, 'b) holidays = H of 'a | W of 'b 
(* H: holiday, W: Working *) 

let my_list = [H Mon; H Tue; W Wed] 

위의 my_list에서 "H Mon"이 아닌 "Mon"을 추출하고 싶습니다.

let result day = match day with 
| H Mon -> Mon 

등과 같이 일치하는 패턴을 하드 코딩하지 않고 어떻게 할 수 있습니까?

매개 변수화 된 구조체 H 또는 W를 적용하지 않은 것처럼 my_list의 첫 번째 요소를 추출하고 싶습니다. 감사합니다 ...!

답변

3

('a', b)가 항상 type = days 일 경우 다른 유형이 될 필요가 없습니다. 작성된대로 '결과'함수의 반환 값을 임의로 'a'또는 'b'가 실제로 다르면 반환 할 수 없습니다. 결과 함수의 리턴 유형은 정확히 'a 또는 b'이어야합니다.

해결 방법에는 100 가지가 있습니다. 또한

type 'a holiday = |H of 'a |W of 'a 

let head_of_holiday_list = fun holiday_list -> begin 
    let first_day::xs = holiday_list in 
    match first_day with 
    |H(x) -> x 
    |W(x) -> x 
    end 

완전히 휴일과 일을 분리하고, 뭔가라는으로 만든 달력을 목록을 공식화 할 수 있습니다 : 여기 당신은 단순히 같은 일을 할 H와 W의 내부 유형을 제한 하나입니다 두 가지 유형의 쌍의 업. 이것은 아마도 두 가지 유형을 분리하는 더 깨끗한 방법 일 것입니다 :

type day_of_week = |Mon |Tues |Wed .. 
type kind_of_day = |Holiday |Workday 
type calendar = (day_of_week, kind_of_day) list 

let first_day_of_week_in_calendar = fun calendar -> begin 
    let (day_of_week_x, kind_of_day_y)::xs = calendar in 
    day_of_week 
    end 

도움이 되길 바랍니다.

+0

고맙습니다. 이 위대한 일했습니다! – recursion1212

관련 문제