2014-10-01 1 views
0

옵션 참조 목록이있는 함수를 작성하고 각 참조가 None이 아닌지 확인합니다. 즉, 기능을 원합니다.OCaml : 체크 참조가 모두 설정되었습니다.

let check rs = 
    List.for_all (fun r -> (!r) != None) rs 

let _ = 
    check [ref (Some 5); ref (Some true)] 

이것은 작동하지 않습니다. check 함수가 좋은 다형성 'a option ref list -> bool 형식으로 본질적으로 괜찮은 것처럼 보일지라도 컴파일러는 [ref (Some 5); ref (Some true)] 목록의 형식을 찾을 수 없습니다.

이 방법을 만들 수있는 방법이 있습니까? 나는 위의 장난감 예를 증류 한있는


내 실제 상황은, 내가 언급 한 무리에 명령 줄 인수의 수를 분석하고 있습니다 것입니다. 인수의 일부는 문자열이고 일부는 int 등입니다. 처음에는 모든 참조가 None으로 설정되고 구문 분석기가 명령 줄 인수를 찾으면 해당 참조가 Some ...으로 설정됩니다. 파싱을 마쳤으므로, 해당 명령 줄 인수를 필수로하고 싶기 때문에 참조 집합의 하위 집합을 반복하여 해당 집합이 여전히 None이 아닌지 확인하려고합니다.

+2

''a option list'는 list 요소가''a option '타입을 가지고 있고 모든 요소가 같은 타입이어야 함을 의미합니다. – ivg

+0

'! ='대신'<>'를 사용하십시오. – newacct

+0

@newacct 왜 그럴까요? –

답변

3

OCaml은 이기종 컨테이너를 지원하지 않습니다. 이 같은 문제를 해결하기 위해 시도 할 수 있습니다 : 문제를 보는

type arg = 
    | Unset 
    | Int of int 
    | Bool of bool 
    (* etc *) 

let check rs = 
    List.for_all (fun r -> (!r) <> Unset) rs 

let _ = 
    check [ref (Int 5); ref (Bool true); ref Unset] 
1

한 가지 방법을 것을 매개 변수의 목록은 OCaml의 한 유형을 부여 할 수있다 : 당신이 만약

# [ ref (Some 5); ref (Some true) ];; 
Error: This expression has type bool option ref 
     but an expression was expected of type int option ref 
     Type bool is not compatible with type int 

'

:

# class cr x = object method is_set = !x <> None end;; 
class cr : 'a option ref -> object method is_set : bool end 
# let reflist = [ new cr (ref (Some 5)); new cr (ref (Some true))];; 
val reflist : cr list = [<obj>; <obj>] 

는 다음 목록의 모든 요소를 ​​확인할 수 있습니다 : 객체 인터페이스 내부에 대한 참조를 포장 기꺼이 다시, 당신은 목록을 가질 수 있습니다

# List.for_all (fun x -> x#is_set) reflist;; 
- : bool = true 
관련 문제