2015-01-29 28 views
5

Bu belki de çok basit bir sorudur, ancak yine de, SO üzerinde kapsanmış gibi görünmemektedir.Haskell- (Tip bildirimi) "a" nedir?

Geçenlerde Haskell aldı ve şu ana kadar beyanlar oluşuyordu yazın çoğunlukla aşağıdaki:

Int 
Bool 
Float 
etc, etc 

Şimdi listeler halinde alıyorum ve ben böyle aşağıdaki işlevinde olarak a kullanmak türü bildirimleri, görüyorum o bir ilişkisel listesini yineler:

contains :: Int -> [(Int,a)] -> [a] 
contains x list = [values | (key,values)<-list, x==key] 

birisi bu a ne olduğu bir açıklama, ve nasıl çalıştığı miyim? Gözlemden, her türü temsil ediyor gibi görünüyor. Bu, herhangi bir türün herhangi bir listesini parametre olarak girebileceğim anlamına mı geliyor? Belirli bir tip imzası tüm a ler aynı türe çözmesi gerektiğini olmak kısıtlama -

cevap

12

Evet, haklısın, bu "her türlü" temsil eder. Böylece, herhangi bir türün bir listesini girebilirsiniz, ancak listede bir değer aramak için contains'u kullandığınızda, baktığınız değer listenin öğeleriyle aynı türde olmalıdır - ki bu elbette anlam ifade eder.

+8

Daha da önemlisi, 'a' özel değil: * herhangi bir küçük harfli tanımlayıcıyı ifade eder. Bu bir type * değişkenidir * ve aynı imzada birden çok farklı türde değişken bulunması mümkündür. Örneğin, 'const :: a -> b -> a', her birinde her türden iki argüman alır ve ilk girdisi ile aynı türde bir değer döndürür. – amalloy

+2

Görüyorum, onun çok genel benzeri. Yani, çoğu durumda, '' 'genellikle fonksiyonumun gerçekten kullanmadığı ya da çok fazla değişmediği öğeleri temsil eder. – Bolboa

+1

@Bolboa: Evet, diğer dillerdeki "jenerikler" kavramıyla yakından ilişkili. Ve evet, eğer tür tamamen jenerik ise, doğrudan değerin kendisinde yapabileceğiniz çok az şey vardır. Haskell, tür hakkında daha fazla bilgi vermenin bir yolunu sunar (örneğin, "eşitlik için karşılaştırılabilir", "yazdırılabilir", "bir sayı gibi ele alınabilir"), böylece değerler üzerinde daha fazla işlem yapabilmenizi sağlar ; Bu konuyla ilgileniyorsanız, dokümantasyonda veya derslerde "sınıflar" a bakın. – psmears

1

Haskell'de, büyük tip küçük tip tip değişkenler ise beton türleri (Int, Bool) ya da tip tanımına (Maybe, Either) vardır. foralltemplate yazıldığından

C++ olarak
contains :: forall a. Int -> [(Int, a)] -> [a] 

,:

template<typename a> 
list<a> contains(int, list<pair<int, a>>); 

contains :: Int -> [(Int, a)] -> [a] 

bu * için steno mı: Bir fonksiyon bu kullandığı tüm tip değişkenlerde örtük jenerik, bu yüzden

Java ve C# 'da, köşeli parantez ile yazılmıştır:

list<a> contains<a>(int, list<pair<int, a>>); 

Tabii ki, bu dillerde, genel tür değişkenler genellikle denir T, U, V, Haskell genellikle a, b, c denilen yaparken. Bu sadece bir kongre farkı.

* Bu sözdizimi GHC'deki -XExplicitForAll bayrağı ve diğer uzantılar tarafından etkinleştirilmiştir.

+0

Çok daha kullanışlı: '-XScopedTypeVariables'. Ayrıca, C++ şablonları doğası gereği Haskell/ML/... tipi değişkenlerden veya Java Jeneriklerinden farklıdır. – dfeuer

İlgili konular