F # пытается создать лучший printf - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь создать оператор печати, который может печатать любой тип.Я хочу использовать сопоставление шаблонов типов для достижения этой цели.

Это не работает:

let print x = match x with | :? int -> printf "INT"; | _ -> None;;

Я получаю сообщение:

let print x = соответствует x с |:?int -> printf "INT";|_ -> Нет ;;
----------------------------- ^^^^^^

stdin (47,30): ошибка FS0008: Это принудительное выполнение или проверка типа от типа 'a до int включает неопределенный тип, основанный на информации, предшествующей этой точке программы.Типовые тесты во время выполнения не разрешены для некоторых типов.Необходимы дальнейшие аннотации типов.

Итак, я не могу сделать сопоставление типов для int?Какие другие типы я не могу сделать сопоставление типов на?Что это означает, что необходимы дополнительные аннотации типов?

1 Ответ

7 голосов
/ 22 марта 2012

Типовое испытание проводится только для эталонных типов. Поэтому:

let print x = 
    match box x with 
    | :? int -> printf "INT"
    | _ -> ()

или

let print (x: obj) = 
    match x with 
    | :? int -> printf "INT"
    | _ -> ()

будет работать.

Обратите внимание, что ваша функция не проверяет тип, поскольку None имеет тип option, который отличается от типа unit типа printf "INT".

...