2012-03-22 2 views
2

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

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

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

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

пусть печать х = матч х с | :? int -> printf "INT"; | _ -> Нет ;;
----------------------------- ^^^^^

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

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

+1

Это означает, что он не может вывести тип «x» из кода, который вы ему дали до сих пор. Ответ Пад должен быть исправлением. Это или вы могли бы просто сделать «% A» в качестве маски для печати. –

+1

Просто, чтобы сделать комментарий @ Onorio более явным: функция, которую вы пытаетесь создать, уже существует: 'printfn '% A" x'. – Benjol

ответ

6

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

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".

Смежные вопросы