2013-09-28 45 views
3

我試圖做一個函數,它的一個(可以是任何類型:int,焦炭......),並創建了一個具有該輸入複製的次數的列表對應於它的ASCII碼。哈斯克爾ASCII碼

我創造了這個:

toList N =複製(fromEnumñ)N

當試圖使用該功能在CMD它說,它可以匹配與預期的類型爲int char,但是如果我直接在cmd中使用我的函數並且具有實際的值,它就會按照它的設想進行操作。

我的意思是:toList '一' - >給我一個錯誤

複製(fromEnum 'A') 'A' - >給出的結果沒有問題

我已經加載模塊Data.Char(ord)

我該如何解決這個問題,爲什麼會發生這種情況?

在此先感謝:)

回答

4

你缺少的是一個類型聲明。你說你希望它能夠採取任何類型,但你真正想要的是toList採取的東西是Enum的一個實例。當你在GHCi中使用它的時候,它會讓你做let toList n = replicate (fromEnum n) n,因爲GHCi會自動選擇一些看起來有意義的默認值,但是當編譯一個帶有GHC的模塊時,沒有類型聲明它將不起作用。你想

toList :: (Enum a) => a -> [a] 
toList n = replicate (fromEnum n) n 

爲什麼你必須有在類型簽名(Enum a) =>的原因是因爲fromEnum有類型簽名(Enum a) => a -> Int。所以你看它不只是任何類型,只有那些具有Enum的實例。

+0

哦,對了,我明白了!那是因爲只有枚舉類型纔有ASCII碼? (對不起,我是新手) – BVCGAAV

+0

並且非常感謝:D – BVCGAAV

+0

@ ipg24 Enum類型與ASCII無關。如果你來自OOP,把它們看作簡單的界面(現在,它們比它更多)。如果某個東西具有'Enum'的實例(即它的實現),那麼它可以被轉換爲整數,或者從整數轉換而來,除此之外沒有什麼更多的東西。 – bheklilr