Entorable # срывать прототип в F #? - PullRequest
2 голосов
/ 17 сентября 2008

В 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

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

Ответы [ 2 ]

2 голосов
/ 17 сентября 2008

Я видел ваш запрос в списке рассылки 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'"]

теплые пожелания,

DannyAsher

> > > > >

ПРИМЕЧАНИЕ. При использовании <pre> угловые скобки вокруг

<'a>
не отображаются, хотя в окне предварительного просмотра все выглядит хорошо. Обратный удар не работал для меня. Пришлось прибегнуть к вам раскрашенной версии, что все не так. Я не думаю, что буду публиковать здесь снова, пока синтаксис FSharp полностью не поддерживается.
1 голос
/ 17 сентября 2008

Прототип pluck использует то, что в 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, вероятно, сделает людей более неясными, глядя на ваш код.

...