Union 中的公共参数
Common parameter in an Union
嗨 FSharpers(或任何 MLer)
仍在努力提高我的域建模技能(来自 OOP)。假设我有以下内容
type A =
| AA of AA
| AB of AB
type AA =
{ Code : 'a
Time : 'b }
type AB =
{ Code : 'a
Whatsoever : 'c }
现在假设我想要以下函数签名:(A -> 'a)
根据我目前的理解,我的解决方案是:
let f (a1:A) =
match a1 with
| AA a -> a.Code
| AB a -> a.Code
此解决方案的不便之处在于,如果我要向 A 并集添加一些新案例,它需要我始终向我的匹配中添加新案例。
我想另一种解决方案是元组类型的解决方案(但丢失了字段的 "naming"):
type A =
| AA of AA * 'a
| AB of AB * 'a
type AA =
{ Time : 'b }
type AB =
{ Whatsoever : 'c }
let f (a1:A) =
snd a1
是否有任何我错过的简单解决方案?
谢谢!
我可能有一个想法,使用泛型类型,例如:
type A =
| AA of Tmp<AA>
| AB of Tmp<AB>
type Tmp<'T> =
{ Code : 'a
Other : 'T }
type AA =
{ Time : 'b }
type AB =
{ Whatsoever : 'c }
这个:
let f (a1:A) = snd a1
不起作用,因为要获取元组,您首先需要匹配 AA
和 AB
.
这可行:
type A0<'b, 'c> =
| AA of AA<'b>
| AB of AB<'c>
type A<'a, 'b, 'c> = A0<'b, 'c> * 'a
let f (a1:A<_,_,_>) =
snd a1
您使用 Tmp<_>
的解决方案等同于使用元组。
顺便说一句,在 F# 中,元素的顺序很重要,为了访问类型 AA
,需要在类型 A
之前声明它。您的第一个示例应如下所示:
type AA<'a, 'b> = {
Code : 'a
Time : 'b }
type AB<'a, 'c> = {
Code : 'a
Whatsoever : 'c }
type A<'a, 'b, 'c> =
| AA of AA<'a, 'b>
| AB of AB<'a, 'c>
let f (a1:A<_,_,_>) =
match a1 with
| AA a -> a.Code
还要使用像 'a
或 'b
这样的通用参数,它们需要在顶部声明:
type A<'a, 'b, 'c> = ...
嗨 FSharpers(或任何 MLer)
仍在努力提高我的域建模技能(来自 OOP)。假设我有以下内容
type A =
| AA of AA
| AB of AB
type AA =
{ Code : 'a
Time : 'b }
type AB =
{ Code : 'a
Whatsoever : 'c }
现在假设我想要以下函数签名:(A -> 'a)
根据我目前的理解,我的解决方案是:
let f (a1:A) =
match a1 with
| AA a -> a.Code
| AB a -> a.Code
此解决方案的不便之处在于,如果我要向 A 并集添加一些新案例,它需要我始终向我的匹配中添加新案例。
我想另一种解决方案是元组类型的解决方案(但丢失了字段的 "naming"):
type A =
| AA of AA * 'a
| AB of AB * 'a
type AA =
{ Time : 'b }
type AB =
{ Whatsoever : 'c }
let f (a1:A) =
snd a1
是否有任何我错过的简单解决方案? 谢谢!
我可能有一个想法,使用泛型类型,例如:
type A =
| AA of Tmp<AA>
| AB of Tmp<AB>
type Tmp<'T> =
{ Code : 'a
Other : 'T }
type AA =
{ Time : 'b }
type AB =
{ Whatsoever : 'c }
这个:
let f (a1:A) = snd a1
不起作用,因为要获取元组,您首先需要匹配 AA
和 AB
.
这可行:
type A0<'b, 'c> =
| AA of AA<'b>
| AB of AB<'c>
type A<'a, 'b, 'c> = A0<'b, 'c> * 'a
let f (a1:A<_,_,_>) =
snd a1
您使用 Tmp<_>
的解决方案等同于使用元组。
顺便说一句,在 F# 中,元素的顺序很重要,为了访问类型 AA
,需要在类型 A
之前声明它。您的第一个示例应如下所示:
type AA<'a, 'b> = {
Code : 'a
Time : 'b }
type AB<'a, 'c> = {
Code : 'a
Whatsoever : 'c }
type A<'a, 'b, 'c> =
| AA of AA<'a, 'b>
| AB of AB<'a, 'c>
let f (a1:A<_,_,_>) =
match a1 with
| AA a -> a.Code
还要使用像 'a
或 'b
这样的通用参数,它们需要在顶部声明:
type A<'a, 'b, 'c> = ...