f#之实现依赖于部分记录类型的惯用方式是什么

lyhabc 阅读:152 2024-07-26 13:47:55 评论:0

我的意图是定义一个具有功能的模块,该模块可以对符合有关键的某些假设的所有记录类型进行操作。

为了说明,让我们有以下代码:

> type DBRow = { id: string ; createdAt: System.DateTime } ;; 
type DBRow = 
  {id: string; 
   createdAt: System.DateTime;} 
 
> let logCreationInfo row = printf "Record %s created at %s " row.id (row.createdAt.ToString()) ;; 
val logCreationInfo : row:DBRow -> unit 

我想更改上面的 logCreationInfo能够对所有具有 id: string 的记录进行操作和 createdAt: System.DateTime (也许还有其他事情)。

来自 typescript 的结构类型,我原以为这是微不足道的,但我正在探索在 F# 中有一种更惯用的方法来处理它的可能性。

我有 attempted使用接口(interface)来处理这个问题,但即使这样可以工作,因为 F# 只支持显式接口(interface),这将不适合我自己没有定义的类型。

请您参考如下方法:

您可以使用 statically resolved type constraints .

let inline logCreationInfo (x : ^t) = 
    printfn "Record %s created at %s"  
        (^t : (member id : string) (x)) 
        ((^t : (member createdAt : System.DateTime) (x)).ToString()) 


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号