Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
为什么Data.String.IsString类型类只定义一个转换?_String_Haskell - Fatal编程技术网

为什么Data.String.IsString类型类只定义一个转换?

为什么Data.String.IsString类型类只定义一个转换?,string,haskell,String,Haskell,为什么Haskell基本包只定义了从String到'like String'值的转换的IsString类,而没有定义从'like String'值到String的逆变换 该类应定义为: class IsString a where fromString :: String -> a toString :: a -> String ref:如果你想使用toString::a->String,我想你只是忘记了show::a->String,或者更准确地说show a=>

为什么Haskell基本包只定义了从
String
到'like String'值的转换的
IsString
类,而没有定义从'like String'值到
String
的逆变换

该类应定义为:

class IsString a where
    fromString :: String -> a
    toString :: a -> String

ref:

如果你想使用
toString::a->String
,我想你只是忘记了
show::a->String
,或者更准确地说
show a=>show::a->String

如果要对同时具有
::a->String
::String->a
的类型进行操作,只需将这些类型类约束放在函数上即可

doubleConstraintedFunction :: Show a, IsString a => a -> .. -> .. -> a
我们小心地注意到,我们避免定义具有一组函数的类型类,这些函数也可以拆分为两个子类。因此,我们不将
toString
放在
IsString


最后,我还必须提到
Read
,它提供了
reada=>String->a
。使用
read
show
进行非常简单的序列化
fromString
from
IsString
有不同的用途,它与语言pragma
OverloadedString
一起很有用,然后您可以非常方便地插入代码,如
“这不是字符串”::Text
。(
Text
是字符串的一种(有效的)数据结构)

原因是
IsString
的主要用途是通过
重载字符串
语言扩展用于Haskell源代码(或(E)DSL——另请参见)中的字符串文本,类似于其他多态文本的工作方式(例如,对于浮点文本,通过
fromRational
;对于整数文本,通过
fromrinteger


术语
IsString
可能有点误导,因为它表明type类表示类似字符串的结构,而实际上它只是表示在Haskell源代码中具有带引号的字符串表示的类型。

我不知道Haskell,但您可能会创建自己的相反类型。
show::show a=>->String
不仅仅是执行到
String
的类型转换,它还添加引号和字符转义,以在Haskell语法中提供字符串表示。因此,
fromString.show
并不等同于您所建议的
id
。您是否真的尝试了
来回
功能?我没有建议它是等效的(不是),我想证明一个函数可以有多个类型约束。但是我意识到,
前后
是一个非常容易误导的名称,但是我用代码中的注释来补偿。无论如何,我编辑了这篇文章,以便更清楚。我还删除了实现并重命名了函数,我同意这是一个很容易混淆的名称。没有此外,mysql simple等软件包中有一些类型使用重载字符串(而不是更安全的方法,如准旋转)来提供一种更简单的方法来构造值,但反向可能并不总是可能的(或唯一的)。当我在Aeson中使用重载字符串标志时,它会删除所有包“name”。但是在另一个上下文中,y已经需要将ByteString解包为String。