2016-03-30 13 views
2

ben Haskell bir derleyici tür yapıyorum ve bu soruna geldi şununla:türünü ulaşamasa 'a' 'dize'

:

Bu benim şu an için var kodudur

data Command a = Input a | Print a 

readCommand:: Read a => String -> Command a 
readCommand entrada 
    | tokens!!0 == "INPUT" = Input (tokens!!1) 
    | tokens!!0 == "PRINT" = Print (tokens!!1) 
    where 
     tokens = words entrada 
     listInstr = lines entrada 

ama bu hatayı alıyorum:

Couldn't match type 'a' with 'String'; 'a' is a rigid type variable bound by the type signature for readC:: Read a => String -> Command a

Expected type: [a] ; Actual type: [String]

bu hata ben bir dize, tip var işlevini ilan etmeleri halinde '' çok bir dize olamaz anlamına mı geliyor? Yardım için

Teşekkür

+0

Sanırım sen ... Oku ' 'çalışacağız hangi kelimeleri/türünüze' BTW a' – Carsten

+0

içine girdi-dizesinden belirteçleri : Belki önce farklı tiplerde tokenleri (veri türleri) ele alması gereken bir ayrıştırıcıyla başlamalısınız? – Carsten

+1

PS, bir "a" döndürme sözü verdiğinize ve daha sonra sadece bir "String" üreteceğine söz verdiğiniz anlamına gelir - eğer readCommand "INPUT 12" :: Command Int 'derken, sorunu görmeniz gerekir – Carsten

cevap

3

hata sonucunda Command a söz verirsen, türe Command a bir sonucu çıkarmak gerektiği anlamına gelir senin fonksiyon isteklerinin arayan (sürece koşulunu karşıladığı sürece Read a) . Yani senin tipin imza Aşağıdaki kod derlemek sağlar:

x :: Integer 
x = readCommand "" 

y :: String 
y = readCommand "" 

z :: [Double] 
z = readCommand "" 

readCommand bu kullanımların tamamı bu türden olan değerlerini üretmek için muktedir yüzden senin tipin imza göre readCommand ihtiyaçları geçerlidir. Tanımladığınız şekil, hangi türden olursa olsun her zaman bir Command String üretecektir. Ve bu sizin türünüzde söz verdiğinizden beri bir derleme hatası alırsınız.

Command String s ürünümüzü üretmek isterseniz, readCommand :: String -> Command String numaralı telefon ürününüzün türüne ihtiyacınız var. Türünüzün şu anda olduğu gibi olmasını istiyorsanız, istenen türden değerler üretmeniz gerekir.

Read a gereksinim duyduğunuzu unutmayın, ancak işlevini asla kullanmayın; bu, Read a gerektiren noktadır. `... = Girdi ($ belirteçleri !! 1 okuyun)` arayan nerede

+0

Tamam, anladım, şimdi yardım için teşekkürler ne olduğunu anladım. Teşekkür ederim! – Outer2g

+0

haskell'in dizginin türünü çıkarmasının bir yolu var mı? Yani, bu durumda kolaydır çünkü veri tipini değiştirebilir ve bir String olmasını bekleyebilirim (zaten değişkenler olacağı için), ancak bunu jenerik yapmak için nasıl yaparsınız? Örneğin: 5'tir !! 1 belirteçleri, yaparsanız haskell Hemen türü vardır 'Oku', kullanmak Outer2g @ int değil bir dize – Outer2g

+1

olarak 5 elde 'Bir Oku => Dize -> a'. – sepp2k

İlgili konular