2008-09-16 2 views
2

В JavaScript, используя библиотеку Prototype, следующий функционал построение возможно:Прототип Перечисляемый # вырывается в F #?

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

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

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