在Seq.find()之后访问属性

Jon*_*ite 2 f#

可能是一个非常简单的问题 - 如果我有一系列对象,我在其上运行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(),因为传递的对象不再是序列.

Bar*_*cki 6

要么你可以使用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)