是否有任何方法可以对有区别的联合函数进行模式匹配,例如: -
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)。
答案 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; ...