区分联合的模式匹配

ljs*_*ljs 7 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
Run Code Online (Sandbox Code Playgroud)

显然这段代码无效F#,因为DefaultTest接受一个Test类型的参数而不是'a - > Test.如果没有为受歧视的联盟指定价值,有没有办法实现这一目标?

最终,我所追求的是一个输入类型'a - > Test并输出Test(默认值'a)的函数的函数.

Bri*_*ian 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 
Run Code Online (Sandbox Code Playgroud)