2017-03-01 58 views
0

我建立了基本的參數化多態性的簡單的類接口:理解String對[Char]的影響?

class Document a where 
    present :: a -> b -> Bool 

instance Document String where 
    present s o = False 

instance Document Int where 
    present i o = True 

implementation :: Document a => a -> Int -> Bool 
implementation v int | int > 10   = present v 
        | otherwise   = False 

我明白,當數值參數的參數由Document限制你必須指定其類型:

print $ implementation (22 :: Int) 400 

我的理解這是由於編譯器不知道22是否是IntFloat

不過,我看,這同樣適用於字符串:

print $ implementation ("mystring" :: String) 400 

再次,String[Char]區分。但是我實際上並不瞭解這些之間的實際差異?

我認爲Haskell的編譯器行爲與C/C++類似,其中所有類型的String在編譯時轉換爲[Char] - 這是不是這種情況?

爲什麼會用而不是String,反之亦然?

+1

沒有區別; 'String'正好是'[Char]',被定義爲'type String = [Char]'。不過,字符串文字可以用'OverloadedStrings'擴展名重載。 – Ryan

+0

你有另一個錯誤:'目前v :: b - >布爾',而不是'布爾'。 – chepner

回答

3

[Char]String之間絕對沒有區別。後者被定義爲類型別名/同義詞:

type String = [Char] 

兩者都是惰性鏈接的字符列表。對於其他表示形式,有Text表示具有連續數組的字符串(如C中所示,粗略但可識別Unicode)。我們也有ByteStrings,但不適合字符串,儘管名稱是:這是一個連續的字節數組,它可以保存二進制數據。然後你需要解碼這些二進制數據才能達到真正的Unicode字符串。如果你知道你的字符是latin-1編碼的,你可以使用ByteString,但是現在真正的應用程序應該是Unicode的。