biz iki polimorfik değişkenler, t
ve a
sahiptir görüyoruz. Bu değişkenler, @
tipi uygulamaların belirtme şeklidir. Tipik sınıf kısıtlamalarının nereye gittiği bağlamında getirilen değişkenlerin, siparişi etkilediği ve dolayısıyla ilk @
, t
ve ikincisini a
belirtir. bağlam değişkenleri olmadan işlevlerinde
const :: a -> b -> a
düzeni, daha açıktır a
ilk ve b
saniyedir. Cactus'un yukarıdaki bir yorumda da belirttiği gibi, siparişi kendiniz belirtmek için açık alan listelerini de kullanabilirsiniz.
myConst :: forall b a. a -> b -> a
Şimdi ilk tip uygulama
b
ve
a
ikinci belirleyecektir.
Sen bu durumda aşırı dizeleri veya listeleri
elem c "abc...xyz" -- What string type is this?
elem c ['a' .. 'z'] -- What list constructor is this?
nedenle kullandığımız açık tip uygulamalar
elem @[] @Char c ['a' .. 'z']
kullanıyorsanız özellikle türlerini belirtmek gerek bu sorun haline çalıştırmak olabilir biz sadece , @[]
belirtmek için var ve "[]
liste türü yapıcı" dır çünkü GHC, liste öğelerinden Char
neden olduğu için @Char
burada ihmal edilebilir.
GHC çıkarımda bir polimorfik argüman size sadece tip o [kısmını] anlaması için GHC anlatan tip uygulama imzaları dahil tipi imzalar içinde _
kullanmasını sağlar -XPartialTypeSignatures
kaldıraç önce gelir olursa, yapmak şeyler daha az verbose. Eğer örneğin varsa:
f @_ @[]
Ben bu durumda belirsizlik olmaması beri, 'TypeApplications' kullanmayı düşünüyorsanız' (bunu kapsadığını veya 'TypedScopeVariables') ExplicitForAll' kullanmak iyi bir fikir olduğunu düşünüyorum 'const :: forall a b. a -> b -> a ', sonra ilk' @ '-argument' a' için, ikincisi ise 'b' için olacaktır. – Cactus
'ScopedTypeVariables' – dfeuer