[英]Why does the Data.String.IsString typeclass only define one conversion?
為什么Haskell基礎包只定義IsString
類以從String
轉換為'like-string'值,而不是定義逆轉換,從'like-string'值到String
?
該類應定義為:
class IsString a where
fromString :: String -> a
toString :: a -> String
參考: http : //hackage.haskell.org/packages/archive/base/4.4.0.0/doc/html/Data-String.html
原因是恕我直言, IsString
的主要目的是用於Haskell源代碼(或(E)DSLs中的字符串文字 - 參見Paradise:嵌入在Haskell中的兩階段DSL )通過類似的OverloadedStrings
語言擴展其他多態文字如何工作的方式(例如,通過fromRational
用於浮點文字或fromInteger
用於整數文字)
術語IsString
可能有點誤導,因為它表明類型類表示類似字符串的結構,而它實際上只是表示在Haskell源代碼中具有引用字符串表示的類型。
如果你想使用toString :: a -> String
,我想你只是忘記了show :: a -> String
,或者更恰當的是Show a => show :: a -> String
。
如果你想對一個同時具有:: a -> String
和 :: String -> a
的類型進行操作,你可以簡單地將這些類型類約束放在函數上。
doubleConstraintedFunction :: Show a, IsString a => a -> .. -> .. -> a
我們仔細注意,我們避免定義具有一組函數的類型類,這些函數也可以拆分為兩個子類。 因此我們不在IsString
放置toString
。
最后,我還必須提一下Read
,它提供了Read a => String -> a
。 您可以使用read
和show
進行非常簡單的序列化。 來自IsString
fromString
有不同的用途,它對語言編譯指示OverloadedStrings
非常有用,那么你可以非常方便地插入像"This is not a string" :: Text
。 ( Text
是字符串的(高效)數據結構)
如果要將Things轉換為字符串並反轉,則應使用Show和Read類。 如果你想在不同的類似字符串的結構之間進行轉換,那么IsString就是您的選擇。 兩種方式都支持轉換,如a-> String和String-> a。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.