2016-10-27 54 views
5

GHC 8.0'da -XTypeApplications ile, @ önceki işlev bağımsız değişkenleriyle açık bir şekilde belirtebilirsiniz. Özellikle birkaç @ kullanıldığında tam olarak hangi türler belirtilir? Eğer bir fonksiyonuHaskell içinde nasıl TypeApplications kullanıyorsunuz?

elem :: (Foldable t, Eq a) => a -> t a -> Bool 

tipine bakarsak

+0

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

+0

'ScopedTypeVariables' – dfeuer

cevap

5

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 @_ @[]