2017-10-04 28 views
5

Inline bu durumda neden çalışmıyor?Bu Tuples için Inlining neden çalışmıyor?

type TupleBuilder() = 
    static member inline Cons(a,(b,c)) = (a, b, c) 
    static member inline Cons(a,(b,c,d)) = (a, b, c, d) 
    static member inline Cons(a,(b,c,d,e)) = (a, b, c, d, e) 

let inline cons h t = TupleBuilder.Cons(h,t) 

TupleBuilder.Cons çağrısı bana

A unique overload for method 'Cons' could not be determined based on type 
information prior to this program point. A type annotation may be needed. 
Candidates: 
static member TupleBuilder.Cons : a:'a0 * ('a1 * 'a2 * 'a3 * 'a4) -> 'a0 * 'a1 * 'a2 * 'a3 * 'a4, 
static member TupleBuilder.Cons : a:'a0 * ('a1 * 'a2 * 'a3) -> 'a0 * 'a1 * 'a2 * 'a3, 
static member TupleBuilder.Cons : a:'a0 * ('a1 * 'a2) -> 'a0 * 'a1 * 'a2 
+0

Derleyici, '' '' '' 'fonksiyonunda kaç elemanın bulunduğunu bilir? Kullanımı görmeden, 2-tuple, 3-tuple veya 4-tuple olup olmadığını bilmiyor. – rmunn

+0

da genellikle "inlining", bu siteye karar vermeyi geciktirdiği için yardımcı olur. ama burada değil. Merak ediyorum – robkuz

cevap

7

Satır içi yalnız çağrı sitesine aşırı yüklenme kararı erteleme gelmez aşağıdaki derleyici hata veriyor. Aşırı yükleme çağrısında type A or type B eklemeniz gerekiyor.

Bu durumda bir ikili operatörünü kullanarak kolayca yapabilirsiniz:

dizilerini daha inline eğlence için
type TupleBuilder() = 
    static member inline ($) (_:TupleBuilder, (b,c))  = fun a -> (a, b, c) 
    static member inline ($) (_:TupleBuilder, (b,c,d)) = fun a -> (a, b, c, d) 
    static member inline ($) (_:TupleBuilder, (b,c,d,e)) = fun a -> (a, b, c, d, e) 

let inline cons h t = (TupleBuilder() $ t) h 


// val inline cons : h:'a -> t: ^b -> 'c 
    when (TupleBuilder or ^b) : (static member ($) : TupleBuilder * ^b -> 'a -> 'c) 

, this old blog post de bakabilirsiniz.