将F#管道运算符转换为索引器属性?
如何将索引管道化到索引器属性中,例如映射将F#管道运算符转换为索引器属性?,f#,pipeline,F#,Pipeline,如何将索引管道化到索引器属性中,例如映射 let aMap = [ (1,'a') (2,'b') ] |> Map.ofList let someChar = 1 |> aMap.Item 在上面的例子中,我得到一个错误“索引器属性必须至少有一个参数” 下面的代码是可行的,但在实际代码中,它看起来有些丑陋和奇怪。有更好的办法吗?不接受indexer属性的管道化项的语言原因是什么?是因为它是一个getter属性而不是一个简单的方法吗 let
let aMap = [
(1,'a')
(2,'b')
] |> Map.ofList
let someChar =
1
|> aMap.Item
在上面的例子中,我得到一个错误“索引器属性必须至少有一个参数”
下面的代码是可行的,但在实际代码中,它看起来有些丑陋和奇怪。有更好的办法吗?不接受indexer属性的管道化项的语言原因是什么?是因为它是一个getter属性而不是一个简单的方法吗
let someChar =
1
|> fun index -> aMap.[index]
编辑:下面是我在转换管道中使用的解决方案的实际使用场景的更好表示,例如:
let data =
someList
|> List.map (fun i ->
getIndexFromData i
|> Map.find <| aMap
|> someOtherFunctionOnTheData
)
|> (*...*)
let数据=
某些人
|>List.map(乐趣i->
getIndexFromData i
|>Map.find someOtherFunctionOnTheData
)
|> (*...*)
根据经验,您不应该通过管道进入索引器属性。明确使用索引器
对于F#collections模块,通常存在一个查找功能,可以用来代替索引访问(
Array.get
,Map.find
,Set.contains
)
let aMap =
[ (1,'a')
(2,'b') ] |> Map.ofList
let someChar =
1 |> aMap.get_Item
也就是说,我无法想象在什么情况下我会这么做。在将多个操作链接到同一数据结构(列表转换等)上的情况下,管道是有意义的,但是使用管道作为调用操作的一般机制只是为了做一件简单的事情引入了更麻烦的语法
索引器的目的是要清楚地表明您正在索引到某个集合中。直接使用它可以使代码更具可读性:
let someChar = aMap.[1]
我的意思是,实际情况是,将索引列表从地图转换为数据记录列表,然后进一步转换。最后,我使用了类似于
|>Map.find Well、x |>Map.find的东西,但实际上是|>Map.find的替代品(fun I->aMap.[I])
,在这一点上我觉得很愚蠢,因为既然我可以使用提供的Map.find函数,为什么还要定义一个新的lambda表达式呢