haskell中String和Data.Text之间的自动转换

Ste*_*lla 29 string haskell type-conversion

正如Nikita Volkov在他的问题中提到的Data.Text vs String我也想知道为什么我必须处理不同的String实现type String = [Char]Data.Texthaskell.在我的代码中,我经常使用packunpack函数.

我的问题:有没有办法在两种字符串类型之间进行自动转换,这样我就可以避免写入pack而且unpack经常这样?

在其他编程语言(如Python或JavaScript)中,例如,如果需要,可以在整数和浮点数之间进行自动转换.我可以在haskell中达到类似的效果吗?我知道,提到的语言是弱类型的,但我听说C++有类似的功能.

注意:我已经知道语言扩展{-# LANGUAGE OverloadedStrings #-}.但据我所知,这种语言扩展只适用于定义为的字符串"...".我希望自动转换字符串,这是我从其他函数获得的,或者我在函数定义中作为参数.

扩展问题: Haskell.Text或Bytestring也涵盖了Data.Text和之间的区别Data.ByteString.有没有办法在三个字符串之间进行自动转换String,Data.Text并且Data.ByteString

Dan*_*zer 30

没有.

Haskell没有因技术,哲学和近乎宗教的原因而进行隐式强制.

作为评论,在这些表示之间进行转换并不是免费的,并且大多数人不喜欢潜藏着潜在的昂贵计算的想法.此外,将字符串作为惰性列表,将它们强制转换为Text值可能不会终止.

我们可以转换成文字,以Text与自动小号OverloadedString通过脱糖字符串文本小号"foo"fromString "foo"fromStringText正义呼声pack.

问题可能是问你为什么这么强迫?是否有一些为什么unpack Text经常需要价值观?如果你不断地将它们改成琴弦,它就会失去目的.


Tit*_*tou 30

几乎是的: 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
Run Code Online (Sandbox Code Playgroud)

注意:在GHCi中,您通常没有提供目标类型的上下文,因此您可以通过明确说明结果的类型来指示转换,例如 read

let z = cs x :: ByteString
Run Code Online (Sandbox Code Playgroud)

性能和对"真正"解决方案的渴望

我还没有意识到任何真正的解决方案 - 但我们已经可以猜出方向了

  • 要求转换是合法的,因为数据不会改变;
  • 为了管理目的,将数据从一种类型转换为另一种类型,从而实现最佳性能;
  • 胁迫是邪恶的 - 甚至是强制的.

因此,方向必须是使这些类型没有不同,即在它们所有的所有类型的拱形式下(或上方)协调它们,允许使用不同的派生来组合函数,而不需要转换.

Nota:我绝对无法评估这个想法的可行性/潜在缺点.可能有一些非常健全的塞子.