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.作者投稿可能会经我们编辑修改或补充。