Создайте список различающего типа объединения с 3 различными примитивными типами - PullRequest
2 голосов
/ 20 марта 2019

Поэтому я пытаюсь создать список различного типа объединения, например;

type ColType = Int of int | Float of float | String of string 

, а затем вставить в список, например

let addToList (list : ColType list) (col : ColType) =
let list' = list @[col]
list'

Однако я не уверенкак инициализировать значения coltype, так как я получаю только такие значения, как int -> coltype и т. д.

Я пробовал эту функцию

let createColType x = 
    if x.GetType() = int then  
        Int x
    else if x.GetType() = float then 
        Float x 
    else if x.GetType() = string then  
        String x
    else 
        String x

, которая, очевидно, не работает, поскольку она будет возвращать разные значения, поэтомукак бы ты решил это?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Используйте match для проверки нескольких параметров и :? для соответствия типу:

let createColType x = 
    match box x with
    | :? int    as i -> ColType.I i
    | :? float  as f -> ColType.F f
    | :? string as s -> ColType.S s
    |_-> failwithf "Type not supported %A" <| x.GetType().FullName

createColType  1  |> printfn "%A" // shows:  I 1
createColType  2. |> printfn "%A" // shows:  F 2.0
createColType "3" |> printfn "%A" // shows:  S "3"
0 голосов
/ 20 марта 2019
type Food = Hamburgers of int | Soda of float | Other of string 
module Food = 
    let tryCreate food = 
        match box food with
        | :? int as i -> Some(Hamburgers i)
        | :? float as f -> Some(Soda f)
        | :? string as s -> Some(Other s)
        | _ -> None

let burgers = Hamburgers 7
let soda = Soda 3.2
let mozzarellaSticks = Other "Mozzarella Sticks"
let mysteryMeat = Option.toList(Food.tryCreate "nobody knows")

let list = [burgers; soda; mozzarellaSticks] @ mysteryMeat

Используя Option в качестве типа возврата для моего tryCreate, я не получу никаких исключений времени выполнения.Вы также заметите, что я пытался создать метки DU, которые связаны с моими бизнес-целями.Это облегчает выражение намерений и делает объединения более полезными, чем простые целые числа, строки и числа с плавающей точкой.Большую часть времени я знаю, какой у меня тип, потому что тип соответствует бизнес-использованию, поэтому мне не нужно писать или использовать tryCreate.Часто на практике не представляется возможным отображать примитивы в наши различимые союзы, рассмотрим, например, если мы добавили | Hotdogs of int, то неоднозначно, если любое добавляемое нами int является хот-догом или гамбургером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...