【发布时间】:2016-01-28 00:10:12
【问题描述】:
我想知道是否有更好的方法来实现接受记录并修改它们的函数。
所以我有两种类型的实体,在磁盘上都有对应的文件:
type Picture = { Artist : string; File : string }
type Book = { Author : string; File : string }
我想要可以复制图片和书籍的通用功能。在 OOP 世界中,我可能会创建公共接口 IArtefact { File : string },在两条记录中实现它,然后创建适用于它的 Move 方法。比如:
let move<'a:IArtefact>(a : 'a) (path : string) =
File.Move(a.File, path)
{ a with File = path }
但是我认为 F# 不支持这样的概念。这样做的 F# 方式是什么?
【问题讨论】:
-
我认为 F# 不支持任何重要的 C# 功能。支持接口和泛型。这是否是在 F# 中解决问题的好方法并不真正属于 StackOverflow 的范围 - 也许您会在 CodeReview 或 Programmers 获得更多帮助。
-
据我所知,没有办法定义实现接口的记录,然后在F#中将此记录转换为该接口。这是非常重要的“C# 特性”。但是我可能是错的,或者存在其他一些这样做的方法。因此,恕我直言,在 SO 上提出此类问题是完全可以的。这不是代码审查,也不是一般的编程问题。
-
为什么不定义如下函数呢?
let move (file : string) (path : string)?然后您可以同时使用aPicture.File和aBook.File调用它。 -
另见现有问题F# how to pass equivalent of interface 及其答案。
-
哦,我现在知道你想返回值了......我建议不要这样做,因为它不仅不纯,而且还违反命令查询分离,所以很快就会变得困难推理。
标签: f#