2015-12-06 25 views
5

Argümanları türlerini bilmediğim bir işlevi çağırmak için bir Tuple oluşturması gereken genel bir işlev var. BöyleBir Seylan Dizisi veya dizisi uygun türdeki genel bir Tuple'ye nasıl dönüştürülür?

şey (bu örnekte array dışında bazı dış kod tarafından oluşturulan, bu yüzden sadece işlevi doğrudan uygulayamazsınız):

Result apply<Result, Where>(
    Anything[] array, 
    Callable<Result, Where> fun) 
     given Where satisfies Anything[] => nothing; 

bu yöntemi uygulamak için bir tip-güvenli yolu var mı ve verilen argümanlar ile çağrılacak işlevi almak?

+0

(istisna atan) sığacak? –

+0

Kesinlikle :) ve dizinin başarılı bir Tuple türü Nerede oluşturabileceğini öğelerine sahip olduğuna güveniyorum. – Renato

cevap

2

Bu

tamamen bitmiş tip-güvenli ... ama tip Where bir kayıt düzeni görünmesi gerektiği gibi dizi gerçekten doğru türde öğeleri içerir varsayarak edilemez, aşağıdaki fonksiyon hile olacaktır olarak

ve uygulamak uygulanan alır: öyle değil zaman tuple türü `Where` varsa ve jenerik olarak sizin diziden nesneler doldurarak bu tür bir demet oluşturmak istiyorum Yani

Result apply<Result, Where>(
    [Anything+] array, 
    Callable<Result, Where> fun) 
     given Where satisfies Anything[] { 
    value tuple = typedTuple(array); 
    assert(is Where tuple); 
    return fun(*tuple); 
} 
+0

Nice ... bu, aslında dil şartnamesiyle garanti ediliyor mu, yoksa sadece mevcut uygulamada mı çalışıyor? –

+0

Bu arada, benzer bir şey dizi yapıcısı ile çalışır: '[* dizi]' 'ceylon.language :: ArraySequence ' türetir, burada T yinelenen öğelerin sınıflarının birleşimidir. –

+1

İşlevin meta modeline sahip olduğunuzda (yani "ceylon.language.meta.model.Function" öğesini uygulayan bir şey), zaten bir "Anything []' gerektiren bir uygulama işlevi vardır. (Bu gerçeği, dinamik bir dilin tercümanını yazarken bazı kodgolf görevleri için zaten kullandım). Yine de genel bir Callable için işe yaramıyor. –

0

fun parametrelerine array türüyle ilgili hiçbir şey yoktur, bu sayede imza güvenli bir şekilde uygulanamaz. array türünü hiç kısıtlamıyorsunuz; herhangi bir şey içerebilir. Prensipte, bir tür güvenli uygulama, fun[String, Integer] ancak array'un [Boolean+] olduğu durumu nasıl ele alır?

Tuple<Anything, Anything, Anything> typedTuple({Anything+} array) { 
    if (exists second = array.rest.first) { 
     return Tuple(array.first, typedTuple({ second }.chain(array.rest.rest))); 
    } 
    else { 
     return Tuple(array.first, []); 
    } 
} 
:
+0

siz haklısınız. Ama sorum, dizi türünün doğru olduğunu varsayar. Çünkü kodumda aslında Ner türünü denetleyerek metamodel kullanarak dizi oluşturmak. – Renato

+0

Eğer * zaten * dizisini oluşturmak için metamodel kullanarak *, o zaman neden sadece doğru yazılmış bir "Tuple" inşa değil? En performanslı kod olmayabilir, ancak https://gist.github.com/jvasileff/9c5b079f6e1526deed2d benzer bir şey yapar. –

+0

Bu tamamen jenerik bir jeneratör kodunda. Hangi türlerin üretilmesi gerektiğini kontrol eder, verilen tipler için jeneratör fonksiyonlarını arayarak örnekler üretir, bunları [Anything +] olarak toplar ve sonra bunu Tuple'a dönüştürmelidir. – Renato

İlgili konular