如何解决DRY自复制型
在 F# 中是否有一种简洁的方式来表达自复制类型? ——也就是说,不重复自己。
// Manual self-replication
type Foo (par1 : Type1,par2 : Type2,par3 : Type3,par4 : Type4) =
let unique = new UniqueState() // unique for every instance of Foo
member this.SelfReplicate =
new Foo(par1,par2,par3,par4) // repeating myself
let a = new Foo(x,y,z,w)
let b = a.SelfReplicate
尝试手动注入自我复制器:
// Semi-automagic self-replication
type Foo' (par1 : Type1,par4 : Type4,replicate : unit -> Foo') =
let unique = new UniqueState() // unique for every instance of Foo'
member this.SelfReplicate = replicate() // not repeating myself
let rec foo' () = new Foo'(x,w,foo')
let a = foo'()
let b = a.SelfReplicate
如果没有编译器魔法,我不确定这怎么能更简洁。似乎应该有一种方法来捕获当前参数和类型,而无需在语法上重复它们。
解决方法
您可以定义类型 WithUnique<'T>
,它是类型 'T
的值的包装器,并为其添加唯一值。您可能需要考虑如何对这些类型进行相等测试 - 如果您使用记录(如下所示),那么具有不同唯一值的两个实例将不相等:
let rnd = System.Random()
let uniqueState() = rnd.Next()
type WithUnique<'T> =
{ Value : 'T; Unique : int }
static member Create(v) : WithUnique<'T> =
{ Value = v; Unique = uniqueState() }
member x.Replicate() =
{ Value = x.Value; Unique = uniqueState() }
'T
的值只是一种类型,但如果您需要包装多个内容,则可以是元组(或记录):
let wu1 = WithUnique.Create( (10,"hi") )
let wu2 = wu1.Replicate()
鉴于上述情况,wu1=wu2
将是 false
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。