F# 中原型的 Enumerable#pluck?
-
09-06-2019 - |
题
在 JavaScript 中,使用 Prototype 库,可以进行以下功能构造:
var words = ["aqueous", "strength", "hated", "sesquicentennial", "area"];
words.pluck('length');
//-> [7, 8, 5, 16, 4]
请注意,此示例代码相当于
words.map( function(word) { return word.length; } );
我想知道 F# 中是否可以实现类似的功能:
let words = ["aqueous"; "strength"; "hated";"sesquicentennial"; "area"]
//val words: string list
List.pluck 'Length' words
//int list = [7; 8; 5; 16; 4]
无需编写:
List.map (fun (s:string) -> s.Length) words
这对我来说似乎非常有用,因为这样您就不必为每个属性编写函数来访问它们。
解决方案
我在 F# 邮件列表上看到了您的请求。希望我能帮忙。
您可以使用类型扩展和反射来实现此目的。我们简单地使用 pluck 函数扩展通用列表类型。然后我们可以在任何列表上使用 pluck() 。未知属性将返回一个列表,其中错误字符串作为其唯一内容。
type Microsoft.FSharp.Collections.List<'a> with
member list.pluck property =
try
let prop = typeof<'a>.GetProperty property
[for elm in list -> prop.GetValue(elm, [| |])]
with e->
[box <| "Error: Property '" + property + "'" +
" not found on type '" + typeof<'a>.Name + "'"]
let a = ["aqueous"; "strength"; "hated"; "sesquicentennial"; "area"]
a.pluck "Length"
a.pluck "Unknown"
这会在交互窗口中产生以下结果:
> a.pluck "Length" ;; val it : obj list = [7; 8; 5; 16; 4] > a.pluck "Unknown";; val it : obj list = ["Error: Property 'Unknown' not found on type 'String'"]
温暖的问候,
丹尼·阿舍尔
> > > > >
笔记:使用时 <pre
> 周围的尖括号
<'a>虽然在预览窗口中没有显示,但看起来不错。反引号对我不起作用。不得不向你求助彩色版本,这是完全错误的。在完全支持 FSharp 语法之前,我想我不会再在这里发帖。
其他提示
原型的 pluck
在 Javascript 中利用这一点 object.method()
是相同的 object[method]
.
不幸的是你不能打电话 String.Length
要么因为它不是静态方法。但是您可以使用:
#r "FSharp.PowerPack.dll"
open Microsoft.FSharp.Compatibility
words |> List.map String.length
然而,使用 Compatibility
可能会让查看你的代码的人更加困惑。
不隶属于 StackOverflow