简体   繁体   English

F# 中原型的 Enumerable#pluck?

[英]Prototype's Enumerable#pluck in F#?

In JavaScript, using the Prototype library, the following functional construction is possible:在 JavaScript 中,使用 Prototype 库,以下功能构造是可能的:

var words = ["aqueous", "strength", "hated", "sesquicentennial", "area"];
words.pluck('length');
//-> [7, 8, 5, 16, 4]

Note that this example code is equivalent to请注意,此示例代码等效于

words.map( function(word) { return word.length; } );

I wondered if something similar is possible in F#:我想知道在 F# 中是否有类似的可能:

let words = ["aqueous"; "strength"; "hated";"sesquicentennial"; "area"]
//val words: string list
List.pluck 'Length' words
//int list = [7; 8; 5; 16; 4]

without having to write:无需编写:

List.map (fun (s:string) -> s.Length) words

This would seem quite useful to me because then you don't have to write functions for every property to access them.这对我来说似乎非常有用,因为这样您就不必为每个属性编写函数来访问它们。

I saw your request on the F# mailing list.我在 F# 邮件列表上看到了您的请求。 Hope I can help.希望我能帮上忙。

You could use type extension and reflection to allow this.您可以使用类型扩展和反射来实现这一点。 We simple extend the generic list type with the pluck function.我们使用 pluck 函数简单地扩展了通用列表类型。 Then we can use pluck() on any list.然后我们可以在任何列表上使用 pluck()。 An unknown property will return a list with the error string as its only contents.未知属性将返回一个列表,其中包含错误字符串作为其唯一内容。

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"

which produces the follow result in the interactive window:在交互式窗口中产生以下结果:

> 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'"]

warm regards,温暖的问候,

DannyAsher丹尼·阿舍

> > > > > > > > > >

NOTE: When using <pre > the angle brackets around注意:当使用<pre > 周围的尖括号

<'a>
didn't show though in the preview window it looked fine. 虽然在预览窗口中没有显示它看起来不错。 The backtick didn't work for me. 反引号对我不起作用。 Had to resort you the colorized version which is all wrong. 不得不求助于你的彩色版本,这是完全错误的。 I don't think I'll post here again until FSharp syntax is fully supported. 在完全支持 FSharp 语法之前,我不认为我会在这里再次发帖。

Prototype's pluck takes advantage of that in Javascript object.method() is the same as object[method] . Prototype 的pluck利用了 Javascript object.method()object[method]相同的优点。

Unfortunately you can't call String.Length either because it's not a static method.不幸的是,您也不能调用String.Length ,因为它不是静态方法。 You can however use:但是,您可以使用:

#r "FSharp.PowerPack.dll" 
open Microsoft.FSharp.Compatibility
words |> List.map String.length 

http://research.microsoft.com/fsharp/manual/FSharp.PowerPack/Microsoft.FSharp.Compatibility.String.html http://research.microsoft.com/fsharp/manual/FSharp.PowerPack/Microsoft.FSharp.Compatibility.String.html

However, using Compatibility will probably make things more confusing to people looking at your code.但是,使用Compatibility可能会使查看您代码的人更加困惑。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM