В 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
Мне это показалось бы весьма полезным, потому что тогда вам не нужно писать функции для каждого свойства, чтобы получить к ним доступ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


pluck Prototype использует то, что в Javascript object.method() совпадает с object[method].
К сожалению, вы также не можете вызвать String.Length, потому что это не статический метод. Однако вы можете использовать:
#r "FSharp.PowerPack.dll"
open Microsoft.FSharp.Compatibility
words |> List.map String.length
Однако использование Compatibility, вероятно, еще больше запутает людей, просматривающих ваш код.
Я видел ваш запрос в списке рассылки 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>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.