F# 管道运算符到索引器 属性?
F# Pipeline operator into an indexer property?
如何将索引通过管道传输到索引器 属性 中,例如:地图?
let aMap = [
(1,'a')
(2,'b')
] |> Map.ofList
let someChar =
1
|> aMap.Item
在上面的示例中,我收到错误消息“索引器 属性 必须至少提供一个参数”
以下有效,但在实际代码中看起来有点丑陋和奇怪。有没有更好的办法?不接受索引器 属性 的流水线项的语言原因是什么?是不是因为是getter属性而不是简单的方法?
let someChar =
1
|> fun index -> aMap.[index]
编辑:下面是我在转换管道中使用的解决方案的实际使用场景的更好表示,例如:
let data =
someList
|> List.map (fun i ->
getIndexFromData i
|> Map.find <| aMap
|> someOtherFunctionOnTheData
)
|> (*...*)
根据经验,您不应通过管道传输到索引器 属性。明确使用索引器。
对于 F# 集合模块,通常存在一个查找函数,可以用来代替索引访问(Array.get
、Map.find
、Set.contains
)。
Item
索引器实际上有一个关联的 getter 方法 get_Item
,F# 编译器明智地从 auto-completion 中隐藏了它,以便人们不使用它,但它允许您使用它:
let aMap =
[ (1,'a')
(2,'b') ] |> Map.ofList
let someChar =
1 |> aMap.get_Item
也就是说,我无法想象我会想要这样做的情况。在您在同一数据结构上链接多个操作(列表转换等)的情况下,管道很有意义,但是使用管道作为调用操作的通用机制只是为了做一件简单的事情而引入了更繁琐的语法。
索引器的作用是明确表示您正在为某个集合编制索引。直接使用它可以使您的代码更具可读性:
let someChar = aMap.[1]
如何将索引通过管道传输到索引器 属性 中,例如:地图?
let aMap = [
(1,'a')
(2,'b')
] |> Map.ofList
let someChar =
1
|> aMap.Item
在上面的示例中,我收到错误消息“索引器 属性 必须至少提供一个参数”
以下有效,但在实际代码中看起来有点丑陋和奇怪。有没有更好的办法?不接受索引器 属性 的流水线项的语言原因是什么?是不是因为是getter属性而不是简单的方法?
let someChar =
1
|> fun index -> aMap.[index]
编辑:下面是我在转换管道中使用的解决方案的实际使用场景的更好表示,例如:
let data =
someList
|> List.map (fun i ->
getIndexFromData i
|> Map.find <| aMap
|> someOtherFunctionOnTheData
)
|> (*...*)
根据经验,您不应通过管道传输到索引器 属性。明确使用索引器。
对于 F# 集合模块,通常存在一个查找函数,可以用来代替索引访问(Array.get
、Map.find
、Set.contains
)。
Item
索引器实际上有一个关联的 getter 方法 get_Item
,F# 编译器明智地从 auto-completion 中隐藏了它,以便人们不使用它,但它允许您使用它:
let aMap =
[ (1,'a')
(2,'b') ] |> Map.ofList
let someChar =
1 |> aMap.get_Item
也就是说,我无法想象我会想要这样做的情况。在您在同一数据结构上链接多个操作(列表转换等)的情况下,管道很有意义,但是使用管道作为调用操作的通用机制只是为了做一件简单的事情而引入了更繁琐的语法。
索引器的作用是明确表示您正在为某个集合编制索引。直接使用它可以使您的代码更具可读性:
let someChar = aMap.[1]