簡體   English   中英

為什么Data.String.IsString類型類只定義一個轉換?

[英]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 您可以使用readshow進行非常簡單的序列化。 來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM