Сопоставление с образцом в различном объединении - PullRequest
7 голосов
/ 08 апреля 2009

Есть ли способ сопоставления с образцом для распознаваемых объединяющих функций, например ::-

type Test =
  | A of string
  | B of int
  | C of char

let DefaultTest t =
  match t with
  | A(_) -> A(null)
  | B(_) -> B(0)
  | C(_) -> C('\u0000')

let a = A |> DefaultTest

Очевидно, что этот код не является допустимым F #, поскольку DefaultTest принимает один параметр типа Test, а не 'a -> Test. Есть ли способ достичь этого без указания значения для дискриминируемого объединения?

То, что я ищу, в конечном счете, это функция, которая вводит функцию типа 'a -> Test и выводит Test (значение по умолчанию' a).

Ответы [ 3 ]

5 голосов
/ 08 апреля 2009

Мне не ясно, что вы ищете, но помогает ли это?

type Foo =
    | A of int
    | B of string

let CallWithDefault f =
    let x = Unchecked.defaultof<_>
    f x

let defaultA = CallWithDefault A    
let defaultB = CallWithDefault B    
printfn "(%A) (%A)" defaultA defaultB 
3 голосов
/ 08 апреля 2009

Не уверен, что вы ищете, но что-то вроде:

let DefaultTest (t :obj) =
  match t with
  | :? (string->Test) as a -> Some (a null)
  | :? (int -> Test) as b -> Some (b 0)
  | :? (char -> Test) as c -> Some (c '\u0000')
  | _ -> Option.None

может работать на вас ...

1 голос
/ 08 апреля 2009

Это может сработать, когда все конструкторы имеют одинаковый тип аргумента, скажем, int. Тогда можно было бы

соответствует t 0 из
| A 0 -> ...
| B 0 -> ...

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