Enumerable # от прототипа в F#?

В 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

Мне это показалось бы весьма полезным, потому что тогда вам не нужно писать функции для каждого свойства, чтобы получить к ним доступ.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
729
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

pluck Prototype использует то, что в Javascript object.method() совпадает с object[method].

К сожалению, вы также не можете вызвать String.Length, потому что это не статический метод. Однако вы можете использовать:

#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

Однако использование 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.

Другие вопросы по теме