F# F中的部分匿名记录#

F# F中的部分匿名记录#,f#,F#,我如何键入一个函数,该函数接受一个记录,该记录包含一个字段a和任何其他字段 在F#中是否可能存在与此标准ML函数等价的函数 fun f{a:string,…}=“Hello”^a; 尝试了以下操作,但这些操作在语法上似乎无效: 设f(r:{a:string;124;})=impl; 设g(r:{a:string;…})=impl; 您可以使用静态解析的类型参数实现此类约束,如下所示: let inline f< ^T when ^T: (member a: string)> (r:

我如何键入一个函数,该函数接受一个记录,该记录包含一个字段
a
任何其他字段

在F#中是否可能存在与此标准ML函数等价的函数

fun f{a:string,…}=“Hello”^a; 尝试了以下操作,但这些操作在语法上似乎无效:

设f(r:{a:string;124;})=impl;
设g(r:{a:string;…})=impl;

您可以使用静态解析的类型参数实现此类约束,如下所示:

let inline f< ^T when ^T: (member a: string)> (r: ^T) = ()

f {| a = "yeet" |} // compiles
f {| a = "yeet"; b = "yote" |} // compiles
f {| b = "yote" |} // error

这样做的好处是隐藏了如何“正确排列”约束的详细信息,并允许您轻松地在其他要公开的内容中重复使用签名。

这太棒了,但我不明白如何从活动模式HasName返回名称。你有解释这个语法的链接吗?这是SRTP“调用”语法。它实际上是在说,“在
x
上调用
HasName
成员”。但是语法是,嗯,有点迟钝。
module M =
    let inline private (|HasName|) x = (^a : (member Name: string) x)

    let inline printName (HasName name) = printfn $"{name}"

type Person1 = { Name: string; Age: int }
type Person2 = { Name: string; Age: int; IsFunny: bool }

type Name(name) =
    member _.Name = name

let p1 = { Name = "Phillip"; Age = 30 }
let p2 = { Name = "Phillip"; Age = 30; IsFunny = false }
let nm = Name "Phillip"

M.printName p1
M.printName p2
M.printName nm