[英]Automatic conversion between String and Data.Text in haskell
正如Nikita Volkov在他的問題中提到的Data.Text vs String我也想知道為什么我必須在haskell中處理不同的String實現type String = [Char]
和Data.Text
。 在我的代碼中,我經常使用pack
和unpack
函數。
我的問題:有沒有辦法在兩種字符串類型之間進行自動轉換,這樣我就可以避免經常編寫pack
unpack
?
在其他編程語言(如Python或JavaScript)中,例如,如果需要,可以在整數和浮點數之間進行自動轉換。 我可以在haskell中達到類似的效果嗎? 我知道,提到的語言是弱類型的,但我聽說C ++有類似的功能。
注意:我已經知道語言擴展名{-# LANGUAGE OverloadedStrings #-}
。 但據我所知,這種語言擴展只適用於定義為"..."
字符串。 我希望自動轉換字符串,這是我從其他函數獲得的,或者我在函數定義中作為參數。
擴展問題: Haskell。 Text或Bytestring還涵蓋了Data.Text
和Data.ByteString
之間的區別。 有沒有辦法在三個字符串String
, Data.Text
和Data.ByteString
之間進行自動轉換?
沒有。
Haskell沒有因技術,哲學和近乎宗教的原因而進行隱式強制。
作為評論,在這些表示之間進行轉換並不是免費的,並且大多數人不喜歡潛藏着潛在的昂貴計算的想法。 此外,將字符串作為惰性列表,將它們強制轉換為Text
值可能不會終止。
我們可以使用OverloadedString
自動將文字轉換為Text
,方法是將字符串文字"foo"
取消為fromString "foo"
,將fromString
為Text
只調用pack
。
問題可能是問你為什么這么強迫? 是否有一些為什么需要經常unpack
Text
值? 如果你不斷地將它們改成琴弦,它就會失去目的。
幾乎是: Data.String.Conversions
Haskell庫使用不同的類型,因此在很多情況下除了大量使用轉換之外別無選擇,因為它是令人反感的 - 重寫庫並不算作真正的選擇。
我看到兩個具體的問題,其中任何一個都可能是Haskell采用的一個重大問題:
編碼最終需要您想要使用的庫的特定實現知識。這對於高級語言來說是一個大問題
簡單任務的表現很糟糕 - 這對於通才語來說是個大問題 。
從具體類型中抽象出來
根據我的經驗,第一個問題是猜測包名稱在基本上對相同數據進行操作的庫之間保持正確功能的時間。
對於這個問題,有一個非常方便的解決方案: Data.String.Conversions
包 ,只要你習慣使用UTF-8作為默認編碼。
該軟件包在許多不同類型之間提供單個cs
轉換功能。
String
Data.ByteString.ByteString
Data.ByteString.Lazy.ByteString
Data.Text.Text
Data.Text.Lazy.Text
因此,您只需import Data.String.Conversions
,並使用cs
,它將根據輸入和輸出類型推斷出正確的轉換函數版本。
例:
import Data.Aeson (decode)
import Data.Text (Text)
import Data.ByteString.Lazy (ByteString)
import Data.String.Conversions (cs)
decodeTextStoredJson' :: T.Text -> MyStructure
decodeTextStoredJson' x = decode (cs x) :: Maybe MyStructure
注意:在GHCi中,您通常沒有提供目標類型的上下文,因此您可以通過顯式聲明結果的類型來指示轉換,例如read
let z = cs x :: ByteString
性能和對“真正”解決方案的渴望
我還沒有意識到任何真正的解決方案 - 但我們已經可以猜出方向了
因此,方向必須是使這些類型沒有不同,即在它們所有的所有類型的拱形式下(或上方)協調它們,允許使用不同的派生來組合函數,而不需要轉換。
Nota:我絕對無法評估這個想法的可行性/潛在缺點。 可能有一些非常健全的塞子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.