F #

2009-03-23 32 views
23

içinde değişken sayıda bağımsız değişkene sahip bir işlev yazmak için C# içinde bir işlevim var ve bunu yapmak için (diğer bazı şeyler arasında) F # 'ye aktarmak istiyorum. Ne yazık ki, ben sadece F # Bu ifade için bir yol var gibi görünüyor kendisi için dava çarptı: Ben bu çok kolay olurdu düşünmüştüF #

public static T Min<T>(params T[] p) where T : IComparable 
{ 
    T m1 = p[0]; 

    foreach (T v in p) 
    { 
     m1 = (m1.CompareTo(v) < 0) ? m1 : v; 
    } 

    return m1; 
} 

bu C# işlevi alın, ama ben anlamıyorum F # değişken değişken listesi belirtir. Bunu denedim:

let rec Min l = 
    match l with 
    | [] -> 0 // should throw exception here 
    | [v] -> v 
    | (h::t) -> min h (Min t) 

ancak C# o çağıran bir Microsoft.FSharp.Collections.List bekliyor. Bir params T[] beklemek mümkün mü ve eğer öyleyse, nasıl?

+0

Değeri ne olursa olsun, işlevinizi şu şekilde yeniden yazmanızı öneririm: min l = Seq.reduce min l – Juliet

+0

Evet, hemen gördüm, şu anda Seq yöntemlerinden geçiyordum (ilk isabet katlandı, ancak azaltın Tam olarak ne arıyorum) – Anteru

cevap

22

Bir params dizisi, Jon'un belirttiği gibi bir niteliğe sahip bir dizidir. Özniteliği parametreden önce ekleyin.

let test ([<ParamArray>] arr : 'a array) = 
    if arr.Length = 0 then invalid_arg "arr" 
    // .... 

Sen türünü belirtmek gerek yok:

let test ([<ParamArray>] arr) = ... // lets type inference do its thing 

Ama ... desen eşleştirme dizisi tipine çalışmaz. Yardım etmek için aktif bir desen yazabilirsiniz. Temel olarak, neyin daha önemli olduğuna karar vermelisiniz: F # kodu veya C# kodu. Daha yüksek mertebeden işlevler tasarlarken, tuplleri kullanır, ayrımcı sendikaları kullanırsanız, aynı tradeoff uygulanır. C#, pek çok şeyi ifade edemez ve F # şu anda C# 'nın küçük parçalarını desteklemez. örneğin derleyici).

+2

Ancak, F # içinde parametre dizileri yalnızca yöntemlerde tanımlanabilir. Modüllerde tanımlanan bağımsız işlevlerde veya işlevlerde kullanılamazlar. http://msdn.microsoft.com/en-us/library/vstudio/dd233213.aspx Test edelim ([] arr) ne yazık ki çalışmıyor –

+0

Ne demek, çalışmıyor? sistemi aç;; izin testi ([] arr) =() ;; - iyi bir derleme gibi görünüyor. – MichaelGG

+0

modülü test = \ N t izin \ testi = \ n \ t \ t testi izin '([] arr) =() \ n \ t \ t testi' n özellikler izin verilmez \ 'izin 'ifadelerdeki bağlamalar –

6

Bu yöntemi F # veya C# olarak adlandırmak mı istiyorsunuz? This hubFS post, F # arama dizisindeki parametre dizilerini desteklemediğini gösterir, ancak bir dizi yapmak için parametre için normal bir tür notu kullanıp kullanmadığınızı ve ParamArrayAttribute ile de dekore edip edemeyeceğinizi sanıyorum. C# değişken değişkenleri ile.

F # içindeki özniteliklerle bir parametrenin nasıl süsleneceğini gördüm, ancak istediğinizde etrafta avlanabiliyorum ... This blog post, bir kaç örnek veriyor ancak parametre düzeyinde değil.