区分联合的模式匹配

时间:2009-04-08 14:18:35

标签: f#

是否有任何方法可以对有区别的联合函数进行模式匹配,例如: -

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 - >测试。有没有办法实现这个没有为歧视联盟指定一个值?

我最终追求的是一个输入'a - >类型函数的函数。测试和输出测试(默认值为'a)。

3 个答案:

答案 0 :(得分:5)

我不清楚你在追求什么,但这有帮助吗?

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 

答案 1 :(得分:3)

不确定你在追求的是什么,但是:

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

可能对你有用......

答案 2 :(得分:1)

当所有构造函数具有相同的参数类型(例如int)时,这可能会起作用。 然后可以

  

匹配
的t 0     | A 0 - > ...
    | B 0 - &gt;     ...