【问题标题】:Function like Num a => a -> Text without String transformation像 Num a => a -> Text 这样的函数,没有字符串转换
【发布时间】:2014-08-02 20:44:14
【问题描述】:

听说show and read的使用是程序的瓶颈。有没有这样不涉及字符串转换的函数:

thow :: Num a => a -> Text
thow = undefined

一个明显的实现是这样的pack . show,但不幸的是这涉及到字符串转换。有什么最佳方法可以实现这一目标吗?

【问题讨论】:

  • 在这种一般形式中:不。但对于具体类型(例如,Integer -> Text),也许。你需要哪个?
  • Num a => a -> TextNum a => a -> String 都不能实现。顺便说一句,你为什么要这样做?你会如何使用thow
  • Rhymoid:这不对。 ShowNum 的超类,所以 show :: Num a => a -> String。或者至少以前是这样的......
  • @JoachimBreitner:等等,Show 不是作为Num 的超类被删除了吗?
  • @Sibi:没有充分的理由依赖EqShowEq 涉及文字模式,但我不认为这是融入Num 的有用功能。 Show 中的功能与 Num 的功能完全不相交。真正的问题是你不能创建更多的抽象实例,比如instance Num a => Num (z -> a),因为函数既不能显示也不能比较。

标签: haskell text


【解决方案1】:

查看text 包的文档,您可能想要使用Data.Text.Lazy.Builder.Int 中的函数,例如:

thow :: Integral a => a -> Text
thow = toLazyText . decimal

如果您查看该模块的代码,您会发现它有 RULESSPECIALIZE 编译指示来优化这一点,如果 a 是常见的整数类型之一。

【讨论】:

    【解决方案2】:

    double-conversion 包针对FloatDouble 执行此操作,并且经过高度优化。我怀疑您能否将其性能与多态函数相匹配(尽管您始终可以专门使用 RULE)。

    【讨论】:

    • 注意Data.Text.Lazy.Build.Int也有这个;我扩展了我的答案。
    • 通过“那个”,我认为您的意思是规则而不是 FloatDouble 的转换(这些在 Data.Text.Lazy.Builder.RealFloat 中可用。这些肯定有效,尽管 IIRC 效率低于double-conversion。不过比 show 好。
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多