为什么Data.String.IsString类型类只定义一个转换?
为什么Haskell基本包只定义了从为什么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=>
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
fromIsString
有不同的用途,它与语言pragmaOverloadedString
一起很有用,然后您可以非常方便地插入代码,如“这不是字符串”::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。