【问题标题】:What is the showS trick in Haskell?Haskell 中的 showS 技巧是什么?
【发布时间】:2019-03-18 02:46:58
【问题描述】:

我已经看到了对 showS 构建字符串的技巧的引用(例如,在 this discussion 中),但我从未见过对其进行很好的描述。

什么是表演技巧?

【问题讨论】:

  • 看这里的答案,简明扼要的总结可能是:“showS 技巧”是将低效的 (O(n^2)) 左关联字符串连接变成高效的 (O(n))通过将字符串转换为(前置)继续,然后组合继续来进行右关联字符串连接。

标签: haskell


【解决方案1】:

在标准库中,ShowS 定义为:

type ShowS = String -> String

这是difference list。 诀窍是字符串xs 由将其添加到任何其他列表的函数表示为ShowS(xs ++)。这允许有效的连接,避免嵌套左关联连接的问题(即((as ++ bs) ++ cs) ++ ds)。例如:

hello = ("hello" ++)
world = ("world" ++)

-- We can "concatenate" ShowS values simply by composing them:
helloworld = hello . world

-- and turn them into Strings by passing them an empty list:
helloworld' = helloworld ""

之所以称为ShowS,是因为它用于标准Show 类型类的实现,以允许高效的showing 大型、深度嵌套的结构;以及show,您可以实现showsPrec,其类型为:

showsPrec :: (Show a) => Int -> a -> ShowS

这允许处理运算符优先级,并返回一个ShowS 值。标准实例实现了这一点而不是 show 以提高效率;然后将show a 定义为showsPrec 0 a ""。 (此默认定义在 Show 类型类本身中,因此您只需为完整实例实现 showsPrec。)

【讨论】:

【解决方案2】:

showS 使用差异列表方法有效地连接显示值的各个组件。该函数采用要显示的值, 一个要附加到结果的字符串。附加的字符串一直向下传递到最右边的子值,直到它到达实际附加的叶子。

这里有差异列表的描述(包括showShttp://www.haskell.org/haskellwiki/Difference_list

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多