Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String haskell中字符串和数据文本之间的自动转换_String_Haskell_Type Conversion - Fatal编程技术网

String haskell中字符串和数据文本之间的自动转换

String haskell中字符串和数据文本之间的自动转换,string,haskell,type-conversion,String,Haskell,Type Conversion,正如Nikita Volkov在他的问题中提到的,我还想知道为什么我必须在haskell中处理不同的字符串实现type String=[Char]和Data.Text。在我的代码中,我经常使用pack和unpack函数 我的问题:是否有一种方法可以在两种字符串类型之间进行自动转换,从而避免频繁编写pack和unpack 例如,在Python或JavaScript等其他编程语言中,如果需要,可以在整数和浮点之间进行自动转换。我能在haskell也找到类似的东西吗?我知道,上述语言是弱类型的,但是我

正如Nikita Volkov在他的问题中提到的,我还想知道为什么我必须在haskell中处理不同的字符串实现
type String=[Char]
Data.Text
。在我的代码中,我经常使用
pack
unpack
函数

我的问题:是否有一种方法可以在两种字符串类型之间进行自动转换,从而避免频繁编写
pack
unpack

例如,在Python或JavaScript等其他编程语言中,如果需要,可以在整数和浮点之间进行自动转换。我能在haskell也找到类似的东西吗?我知道,上述语言是弱类型的,但是我听说C++有类似的特性。 注意:我已经知道语言扩展名
{-#language-OverloadedStrings}
。但据我所知,这种语言扩展只适用于定义为
“…”
的字符串。我想对从其他函数或函数定义中的参数获取的字符串进行自动转换

扩展问题:还包括
数据.Text
数据.ByteString
之间的差异。有没有办法在三个字符串
String
Data.Text
Data.ByteString
之间进行自动转换

哈斯凯尔没有出于技术、哲学和几乎宗教的原因而进行隐性强迫

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

我们可以使用
OverloadedString
s自动将文本转换为
Text
s,方法是将字符串文本
“foo”
中的
fromString“foo”
fromString
中的
Text
仅调用
pack


问题可能是问你为什么要强迫这么多?是否有一些原因需要如此频繁地
解包
文本
值?如果您不断地将它们更改为字符串,则会有点违背目的。

几乎是肯定的:
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
因此,您只需导入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
性能和“真正”解决方案的呼声

到目前为止,我还不知道有什么真正的解决办法,但我们已经可以猜出方向了

  • 要求转换是合法的,因为数据没有改变
  • 通过不出于管理目的将数据从一种类型转换为另一种类型来实现最佳性能
  • 强迫是邪恶的——甚至是强迫性的
因此,方向必须是使这些类型不存在差异,即在它们都将从中派生的archtype之下(或之上)协调它们,允许使用不同派生组合函数,而无需转换


注:我绝对无法评估这个想法的可行性/潜在缺陷。可能有一些非常合理的停顿。

如果您想要进行类型推断,则不存在也不可能存在这种情况。如果答案是否定的,Haskell不会自动在类型之间转换。您只能对文本进行自动转换,因为字符串文本的类型为
AsString a=>a
,就像数字文本的类型为
Num a=>a
,但不会对运行时值进行自动转换。谢谢您的快速回答!谢谢你的回答和解释。我问这个问题是因为我想知道我是否可以省略经常使用的
pack
ùnpack
(我需要数据。Text因为它更节省内存,但我使用许多使用字符串的包)如果你不得不
解包
将数据传递给其他包,你或多或少会失去
Text
的大部分优势,我想知道什么是“近乎宗教”的原因。你能举例说明cs的ghci应用程序吗?Prelude Data.String.Conversions Data.String.Conversions>cs“stuff”:10:1:错误:•约束中的非类型变量参数:ConvertibleStrings[Char]