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

时间:2011-10-21 16:36:48

标签: string haskell

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

该类应定义为:

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

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

3 个答案:

答案 0 :(得分:14)

原因是恕我直言,IsString的主要目的是通过{{1}用于Haskell源代码(或(E)DSLs中的字符串文字 - 另见Paradise: A two-stage DSL embedded in Haskell)语言扩展与其他多态文字的工作方式类似(例如,通过OverloadedStrings表示浮点文字,或fromRational表示整数文字)

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

答案 1 :(得分:6)

如果您希望使用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,其中提供了Read a => String -> a。您可以使用readshow进行非常简单的序列化。来自fromString的{​​{1}}有不同的目的,它对语言编译指示IsString很有用,那么您可以非常方便地插入像OverloadedStrings这样的代码。 ("This is not a string" :: Text是字符串的(高效)数据结构)

答案 2 :(得分:1)

如果要将Things转换为字符串并反转,则应使用Show和Read类。如果你想在不同的类似字符串的结构之间进行转换,那么IsString就是您的选择。两种方式都支持转换,如a-> String和String-> a。