2015-04-27 28 views
8

Haskell'de, type ve newtype türleri için bir takma ad sağlamanın iki yolu vardır.C# 'nun Haskell'in yeni tipine eşdeğer nedir?

type UserId = Int 
hasAccess :: UserId -> Bool 
hasAccess id = {-- stuff --} 

-- Elsewhere in the program 
login :: Int -> Bool 
login n = hasAccess n -- Typechecker won't complain 

bir newtype benzer, ama farklı bir türü olarak türü denetleyicisi tarafından kabul edilir: type orijinal modeli tam olarak aynı şekilde türü denetleyicisi tarafından kabul edilir eşanlamlısı bir tipi eşanlamlı sağlar :

using UserId = Int; 
0123: C# '

newtype UserId = UserId Int 
hasAccess :: UserId -> Bool 
hasAccess (UserId id) = {-- stuff --} 

-- Elsewhere in the program 
login :: Int -> Bool 
login n = hasAccess n -- Typechecker will complain, n isn't a UserId ! 

, bir üst seviyesi ile using beyanı tipi eş anlamlılarını tanımlayabilir

Ancak, güçlü yazılan, derleyici tarafından denetlenen bir tür diğer adı varsayılan olarak C# içinde görünmüyor. Bir sınıf sargısını oluşturmak için T4 şablonları ve CodeDOM ile otomatik kod oluşturmayı inceledim, ancak bunları programlama akışımda nasıl temizleyebildiğimi gerçekten bilmiyorum.

İdeal olarak, bir üst düzeyde söyleyebilmek istiyorum:

// Something like this? 
using Int.UserId; 

/* Elsewhere */ 
var id = new UserId(5); 

public bool HasAccess(UserId id) 
{ 
    /* Stuff */ 
} 

Bu derleme zamanında de dişli içine kod üretimi başladı. Bu mümkün değilse veya IntelliSense için bir tavuk ve yumurta sorunu sağlıyorsa, her x dakikada bir (veya bir düğme veya her neyse) çalışan bir otomatik derleme seçeneği iyi olurdu.

+2

Bunu neden yapmak istediğiniz konusunda biraz bilgi verebilir misiniz? –

+0

Kodunuzu neden her x dakikada bir derlemek istersiniz? – Georg

+1

Başka tür adı altında bir tür gizleme kullanımı nedir? – Franck

cevap

13

Hayır, C#'nin böyle bir özelliği yok. Bunu yapabileceğiniz en yakın yapılar yapılardır.

public struct UserId 
{ 
    public int Id { get; private set; } 

    public UserId(int id) : this() { Id = id; } 
} 

Bu şekilde, derleyici gerçekten UserId ve int olarak farklı davranır. Ayrıca, int'un etkili bir şekilde kullanıcı kimliği olması nedeniyle UserId'a daha fazla yöntem ekleyebilirsiniz. Bunun, çalışma zamanı üzerinde tek bir int alanına sahip bir yapı kullanarak herhangi bir etkisi olmadığına dikkat edin, doğrudan int'u kullanmaya karşı herhangi bir ek yüke neden olmaz.

Düzenleme: Eğer T4 hakkında sorulan Çünkü Visual Studio ile çalışıyorsanız, kolayca (C#) genişleyecek yeni T4 Metin şablon oluşturabilir - kodu ve otomatik olarak derlenmiş olacaktır. Şablon, kaydettiğiniz her seferde yürütülür.

+1

Haskell'deki yeni türlerle ilgili önemli bir şey, çok ucuz bir soyutlama olmalarıdır (aslında, tip kontrolünden sonra tamamen optimize edilmiştir). Bu anlamda, yapılar doğru cevaptır. – kqr