gpt4 book ai didi

haskell - 编写丰富的 Haskell "show"函数的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-01 22:30:50 26 4
gpt4 key购买 nike

我对correct implementation的理解对于 Haskell 的 ShowRead 来说,read.show 应该是恒等的。如果为 true,则 read 需要能够执行一些非常困惑的字符串解析,或者 show 必须提供相当有限的功能(从用户体验的角度来看)。

是否存在read.show == id,如果是这样,对于函数命名和调用,为了更丰富的值(字符串)表示,可接受的 Haskell 实践是什么?

最佳答案

首先,show 预计会生成一个遵循 Haskell 语法的字符串——理想情况下,人们应该能够将其剪切并粘贴到 Haskell 文件中并使其工作。

话虽这么说,请阅读。 show 预计是身份。不过,有时候放松一点,只需要这样

read (show x) == x

其中 (==) 是由相关 Eq 实例定义的等价。我相信这方面的原型(prototype)示例是 Data.Set.Set,它在内部表示使用平衡二叉搜索树 (BST) 的集合。它的 Show 实例生成以下形式的字符串

fromList [1,2,3,4,6,7]

读回这样的字符串可能会产生不同的 BST,但它仍然==到旧的。从用户的角度来看,没有(可观察到的)差异。

打印自定义“不透明”类型时,通常可以使用相同的 fromSomeTransparentType 值 字符串编码。

最后,我认为这些与 Show 相关的“社会契约”在图书馆中比在应用程序中受到更多尊重。这是因为在应用程序中,人们有时可以合理地假设没有其他人(除了应用程序本身)会使用这些实例。例如,我认为这对于应用程序来说是可以的:

data Exp = Add Exp Exp | ...
instance Show Exp where
show (Add e1 e2) = "(" ++ show e1 ++ ", " ++ show e2 ++ ")"
<小时/>

“其他”法则显示。一般来说,read == id 不成立。首先,read 是部分的。其次,即使不考虑偏爱,read方法也可以对其输入更加宽松,例如将重复的空格视为单个空格,或忽略多余的括号:(如下 AJFarmar 建议的那样)

show (read "Just (((6)))") = "Just 6"

关于haskell - 编写丰富的 Haskell "show"函数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com