2013-04-18 31 views
9

Bir süredir Haskell üzerinde çalışıyorum, bu yüzden yeni biriyim. İşteTam tip bilgisi olmayan Haskell polimorfik çağrıları

purStrLn $ show [1] 

biz (varsayılan) ile her türlü çıkarabiliriz ve tüm iyi çalışıyor:

Aşağıdaki kod çok kolay anlaşılabilir. Ama Aşağıdaki kod da çalışır:

putStrLn $ show [] 

biz liste türünü tahmin edemez bile. Ben GHCi kodu yürütebilir Eğer

aşağıdaki elde:

Prelude> [] 
[] 
Prelude> :t it 
it :: [a] 
Prelude> 

böylece tip polimorfik gibi görünüyor. Fakat bu durumda, gösteri kısmen uygulanan bir tiple çağrılacaktı.

Aynı davranış diğer türlerde de geçerlidir, örneğin Data.Map.empty ile, bu bir liste özelliği değildir (veya en azından benziyor).

Neden ve nasıl çalışır?

+0

'purStrLn $ gösterisi [1]' hala türüne varsayılan vardır: Vitus -Wall ile ghci çalışan (veya ~/.ghci için :set -Wall ekleme) daha kolay varsaymak noktaya yapar yorumlarda belirttiği gibi '[1] :: (Num n) => [n]' – amindfv

+0

Bu doğru, ancak böyle durumlarda varsayılanlar var. – Totoro

+2

Tür değişkeni, örn. uzunluk [] ', bkz: http://stackoverflow.com/q/7076517. – hammar

cevap

16

Her şeyden önce, bu yalnızca ghci'da çalışır.

Test.hs:3:19: 
    Ambiguous type variable `a0' in the constraint: 
     (Show a0) arising from a use of `show' 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the second argument of `($)', namely `show []' 
    In the expression: putStrLn $ show [] 
    In an equation for `main': main = putStrLn $ show [] 

gitmek hata yapar bir tür imza ekleme:

module Main where 

main = putStrLn $ show ([]::[Int]) 

Ama neden ghci işe yaramadı sen ghc ile bu programı derlemeye çalışırsanız bir tür hatası alırsınız? Yanıt, ghci numaralı telefondan extended type defaulting: a'un türü () (birim tipi) olarak ayarlanmıştır.

Bu davranışa yönelik motivasyon, kullanıcının her zaman yorumlayıcıda çalışırken türleri belirtmesi biraz yorucu olmasıdır. olarak,

<interactive>:2:12: 
    Warning: Defaulting the following constraint(s) to type `()' 
       (Show a0) arising from a use of `show' 
    In the second argument of `($)', namely `show []' 
    In a stmt of an interactive GHCi command: it <- putStrLn $ show [] 
+3

Ayrıca, GHCi'de ': set -Wall' yazarak bu varsayılanı belirlemeye yardımcı olur. – Vitus

+0

Harika, çok açıklayıcı bir cevap :) – Totoro

İlgili konular