DRY自复制型

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?