我有这段代码片段,它创建了一个匿名类型元素数组,其中包含Name和FirstLetter属性:
string[] arr = { "Dennis", "Leo", "Paul" };
var myRes = arr.Select(a => new { Name = a, FirstLetter = a[0] });
我想在F#中做同样的事情。我试过了:
let names = [| "Dennis"; "Leo"; "Paul" |]
let myRes = names.Select(fun a -> {Name = a; FirstLetter = a[0]} )
但这不编译。它说:
未定义记录标签“名称”。
如何让这条线在F#中工作?
与评论一样,F#不支持匿名类型。因此,如果您想将序列投影到另一个序列中,请创建一个记录,它实际上是一个带有命名字段的元组。
type p = {
Name:string;
FirstLetter: char
}
let names = [| "Dennis"; "Leo"; "Paul" |]
let myRes = names.Select(fun a -> {Name = a; FirstLetter = a.[0]} )
从F#4.6开始,您的初始尝试将更直观。使用.NET Core SDK 3.0.100-preview4测试类似示例我能够使用新的Anonymous Record功能证明这一点。
let names = [| "Dennis"; "Leo"; "Paul" |]
let myRes = names.Select(fun a -> {| Name = a; FirstLetter = a.[0] |})
注意在花括号的内侧使用|
字符。这就是现在将常规记录与F#中的匿名记录区分开来的原因。另请注意,在访问F#中字符串的第一个字符时,必须使用.
method accessor operator来访问索引器,就像访问其他方法一样。
let names = [| "Dennis"; "Leo"; "Paul" |]
let myRes = names.Select(fun a -> a, a.[0])
for r in myRes do
let name, firstletter = r
printfn "%A, %A" name firstletter