可能是一个非常简单的问题 - 如果我有一系列对象,我在其上运行Seq.find()以返回单个元素,那么如何在不将整个元素存储为变量的情况下访问一个属性?
例如
type MyType = { Id : int; Text : string }
let obs = [| { Id = 1; Text = "Hello" }; { Id = 2; Text = "Goodbye" } |] :> seq<MyType>
let getFirstText (array : seq<MyType>) = 
  array |> Seq.find(fun mt -> mt.Id = 1) |> .Text
                                            ^^^^^  
getFirstText obs |> printfn "%s" 
Run Code Online (Sandbox Code Playgroud)
这给出了意外的符号'.' 在表达中.
尝试Seq.find(fun mt -> mt.Id = 1).Text给出类型约束不匹配 - 类型'' - > MyType'与第 6行的类型'MyType'不兼容.
您不能使用Seq.Map(),因为传递的对象不再是序列.
要么你可以使用parens:
(array |> Seq.find(fun mt -> mt.Id = 1)).Text
Run Code Online (Sandbox Code Playgroud)
或lambda抽象:
array |> Seq.find(fun mt -> mt.Id = 1) |> (fun mt -> mt.Text)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用pick函数然后定义mt符号一次:
array |> Seq.pick (fun mt -> if mt.Id = 1 then Some my.Text else None)
Run Code Online (Sandbox Code Playgroud)