Программирование 101: если вы себя повторять то же самое снова и снова, пакет его для повторного использования, сделать его функцией. В вашем случае, функция будет родовым (т.е. принимать параметр любого типа) и сделать вентиляционное от параметра:
let pair name value = name, value :> obj
myfun [pair "Name" "Freddie"; pair "Age" 50]
Хм ... Не намного лучше, правда? Но подождите, мы еще не закончили! Теперь, когда у вас есть эта функция, вы можете дать ей более приятное имя, которое сделает его приятнее. Скажем, ==>
:
let (==>) name value = name, value :> obj
myfun ["Name" ==> "Freddie"; "Age" ==> 50]
Если набор возможных типов известен заранее и относительно небольшой (как ваш вопрос, кажется, указывает), вы можете пойти на шаг дальше и проверку компилятора, которые используются только разрешенные типы , Чтобы сделать это, вам нужно использовать метод перегрузку, статический разрешенные ограничения типа и некоторые синтаксические фокусы:
type Casters() =
static member cast (v: string) = v :> obj
static member cast (v: float) = v :> obj
static member cast (v: int) = v :> obj
static member cast (v: string list) = v :> obj
static member cast (v: float list) = v :> obj
static member cast (v: int list) = v :> obj
let inline cast (casters: ^c) (value: ^t) =
((^c or ^t) : (static member cast : ^t -> obj) value)
let inline (==>) name value = name, (cast (Casters()) value)
["Name" ==> "Freddie"; "Age" ==> 50] // OK
["What?" ==> true] // Error: "bool" is not an allowed type
Спасибо, но ваша функция _pair_ дает мне _The статическое принуждение от типа» а в «Ь включает неопределенный тип на основе информации до этой программы point_. Вы не видите ту же ошибку? [tryfsharp] (http://www.tryfsharp.org/create/seankearon/file3.fsx) –
Ошибка. Я скопировал ваш 'upcast' вместо правильного оператора upcast с фактическим типом. Исправил его сейчас. –
Это мило, спасибо! –