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

Zhe*_*hen 13 string haskell

为什么Haskell基础包只定义IsString要转换String为'like-string'值的类,而不是定义逆转换,从'like-string'值到String

该类应定义为:

class IsString a where
    fromString :: String -> a
    toString :: a -> String
Run Code Online (Sandbox Code Playgroud)

参考:http://hackage.haskell.org/packages/archive/base/4.4.0.0/doc/html/Data-String.html

hvr*_*hvr 15

原因是恕我直言,其IsString主要目的是通过语言扩展以类似的方式用于Haskell源代码(或(E)DSL中的字符串文字 - 参见Paradise:嵌入在Haskell中的两阶段DSL)OverloadedStrings其他多态文字如何工作(例如,通过fromRational浮点文字或fromInteger整数文字)

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

  • 另请注意,像mysql-simple这样的包中有一些类型使用OverloadedStrings(而不是像QuasiQuotation这样更安全的方法)来提供一种更简单的构造值的方法,但反过来可能并不总是可能(或唯一). (2认同)

Tar*_*sch 6

如果你想使用toString :: a -> String,我认为你只是忘记show :: a -> String或更恰当Show a => show :: a -> String.

如果你想在一个带有:: a -> String 的类型上操作:: String -> a,你可以简单地在函数上放置那些类型类约束.

doubleConstraintedFunction :: Show a, IsString a => a -> .. -> .. -> a
Run Code Online (Sandbox Code Playgroud)

我们仔细注意,我们避免定义具有一组函数的类型类,这些函数也可以拆分为两个子类.为此,我们不把toStringIsString.

最后,我还必须提一下Read,提供的内容Read a => String -> a.您使用readshow进行非常简单的序列化.fromStringfrom IsString有不同的用途,它对语言编译指示很有用OverloadedStrings,那么你可以非常方便地插入代码"This is not a string" :: Text.(Text是字符串的(高效)数据结构)

  • `show :: Show a => a - > String`的问题在于它不只是对`String`执行类型转换,而且它还添加了引号和字符转义以在Haskell语法中提供字符串表示.因此,`fromString.show`不等同于你似乎建议的`id`.你真的尝试过你的`backAndForth`功能吗? (9认同)