2011-07-16 11 views
6

Haskell ile deneme yapmaya başladım ve bir problemim var. qqq, "Hiçbir şey" ile çağrılırsa bir dizgi basması ve "Sadece bir şey" ile çağrılırsa başka şeyler yazdırması gereken bir işlevdir.Haskell'in Kullanımı "Belki", bildirimler yazın [beginner soru]

qqq Nothing = print "There isn't anything to be printed." 
qqq (Just x) = print "There is something to be printed." >> print x 

main :: IO() 
main = qqq (Just 43) 

Ama:

ilk girişim çalışma gibi görünüyor

  • Ben başarısız main = qqq (Nothing) yapmaya ("Muğlak tip kısıtlaması içinde değişken` a0' : (Göster a0) Ben türü imza eklemek istediğinizde 'qqq'ait' ") bir kullanımından kaynaklanan
  • başarısız olursa:
    • qqq :: Maybe x => x -> IO() ->Type constructor 'Maybe' used as a class -> Ama öyle değil mi?
    • qqq :: (Maybe x) -> IO(). Şimdi imzanın kendisi başarılı gibi görünüyor. Ancak main = qqq (Just 43), main = qqq (Nothing) örneğinde olduğu gibi gizemli (Show a0) hatasıyla başarısız oluyor.

Sorular:

Nothing ile qqq çağıran Just 43 ile arayarak daha çok farklı neden
  1. ?
  2. (Show a0) nedir? Sadece hata mesajlarında belirtilmiştir. Bunu kullanmak için herhangi bir girişimi "kapsamda gösterme" gibi bir şeye yol açar.
  3. Bunun için doğru tip imzası nedir? Haskell baskı tipi imzası nasıl sonuçlandırılır? Bekleniyor gibi bir şey:
f 0 = 2 
f x = (f (x-1)) + 3 

main = print get_type_as_string(f) 
-- prints "Number -> Number" 

cevap

9

qqq türüdür:

qqq :: Show a => Maybe a -> IO() 

qqqile, tip Maybe a bir parametre alır ve bir değer olmayan bir IO işlem döner anlamına gelir kısıtlaması a, Show typeclass uygular. Show'un ne olduğunu öğrenmek için, ghci'de :i Show'u kullanabilirsiniz.

Show, türün bir değerinin bir dizeye dönüştürülebilmesini gerektiren bir yazım türüdür. qqq, print değerini yazdırmak istediği için kısıtlamaya sahiptir (print, Show a => a -> IO() tipindedir). Maybe, bir yazım hatası değil, bir veri türüdür. Tipleri here hakkında daha fazla okuyabilirsiniz. GHC, imza işlevini .hs dosyasında yazarak, ardından dosyayı ghci (ghci Myfile.hs) ile yükleyerek ve türün görüntülenmesi için :t qqq yazarak, tür imzasını çıkarmasına izin verebilirsiniz.Fonksiyonu interaktif oturumda let qqq n = case n of { Nothing -> print "abc"; Just x -> print "def" >> print x } ile de tanımlayabilirsiniz (işlev tanımı ghci'de bir satırda olması gerektiğinden biraz farklı görünmektedir, ancak anlam aynıdır).

ana aramaları qqq (Just 43) ile qqq, açık olduğunda Maybe a somut tipi sayısal bir tipi (tamsayı GHCi varsayılan), yani qqqMaybe Integer -> IO() somut türü vardır. Ancak, qqq Nothing, a ile qqq numaralı ana çağrılar herhangi bir şey olabilir (belirsizdir) ve ghci bir hata bildirir.

+0

Ayrıca, "Neden hiçbir şey ayarlayamıyorum ghci, bu ayrıştırma hatası '=" ' –

+0

Olduğunu" belirsiz bir soru "belirsiz" her zaman Haskell başarısız veya karar verebilir "türü Burada önemli, bazen belirsiz olsun "bazen? –

+0

Haskell, derleyici ne yapacağını bilmediğinde belirsiz türlerden şikayetçidir. Yani derleyici türün ne olacağını öğrenebilirse, sorun yok, ancak tür hakkında yeterli bilgi olmadan türetilmiş olması gerekiyorsa, hatayı alırsınız. – Antti