为什么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源代码中具有带引号字符串表示的类型.
如果你想使用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)
我们仔细注意,我们避免定义具有一组函数的类型类,这些函数也可以拆分为两个子类.为此,我们不把toString在IsString.
最后,我还必须提一下Read,提供的内容Read a => String -> a.您使用read和show进行非常简单的序列化.fromStringfrom IsString有不同的用途,它对语言编译指示很有用OverloadedStrings,那么你可以非常方便地插入代码"This is not a string" :: Text.(Text是字符串的(高效)数据结构)
| 归档时间: |
|
| 查看次数: |
2507 次 |
| 最近记录: |