2008-09-16 16 views
2

, Prototip kitaplığı kullanarak, aşağıdaki fonksiyonel yapı mümkündür: Bu örnek kod benzer bir şey F # mümkün olup olmadığını merak ettimPrototip'in Numaralandırılabilir # # F içinde Fiş? JavaScript'inizde

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

eşdeğer olduğunu

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

Not:

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

yazmak için:

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

Bu benim için oldukça yararlı görünebilir, çünkü o zaman onlara erişmek için her özellik için işlev yazmanız gerekmez.

cevap

2

Talebinizi F # postalama listesinde gördüm. Umarım yardımcı olabilirim.

Buna izin vermek için yazı tipi uzantısı ve yansıtma kullanabilirsiniz. Genel liste türünü pluck işleviyle basitleştiririz. Sonra herhangi bir listede pluck() kullanabiliriz. Bilinmeyen bir özellik, hata dizgisini içeren bir listeyi, yalnızca içeriği olarak döndürecektir. Etkileşimli pencerede takip sonuç üretir

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

sıcak açısından,

DannyAsher

> > > > >

NOT: <pre> kullanırken,

<'a>
köşeli parantezler önizleme penceresinde görünse de iyi görünmüyordu. Backtick benim için çalışmadı. Size yanlış olan renklendirilmiş versiyonu başvurmak zorunda kaldı. FSharp sözdizimi tam olarak desteklenene kadar burada tekrar yayınlayacağımı sanmıyorum.

1

Prototip'in pluck, Javascript object.method() sürümünden object[method] ile aynıdır.

Ya da statik bir yöntem olmadığından, String.Length numaralı telefonu arayamazsınız. Bununla birlikte kullanabilirsiniz:

#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

Ancak Compatibility kullanarak muhtemelen kodu baktığımızda insanlara daha da karışık bir hale getirecektir.