gpt4 book ai didi

string - 缩进字符串中的所有行

转载 作者:行者123 更新时间:2023-12-01 21:12:33 25 4
gpt4 key购买 nike

我有一些定义了自定义 Show 实例的类型。它们的结构如下:

data TopLevel = TopLevel SndLevel
data SndLevel = SndLevel Int

instance Show SndLevel where
show (SndLevel i) = "SndLevel: \n\t" ++ (show i)

我的 SndLevelShow 实例会生成漂亮的字符串,当它们出现在我的输出中时,它们看起来如下所示:

SndLevel: 
5

我想为 topLevel 创建一个 Show 实例,使 TopLevel (SndLevel 5) 在打印到终端时看起来像这样:

TopLevel
SndLevel
5

我希望找到 Haskell 中内置的函数,该函数会在字符串前面以及出现 "\n" 的每个位置之前添加 "\t"在该字符串中。

我发现的最佳解决方案将遵循 this 中的答案。邮政。在这种情况下,我会将 "\n" 替换为 "\t\n"

我想我不是第一个需要 Show 实例来在 Haskell 中分层组织数据的人,所以我想知道是否有更惯用的方法来完成此任务。有更好的办法解决我的问题吗?

p.s:我意识到这种打印对于我上面使用的示例数据类型来说并不是最好的。我想要为其编写实例的实际数据类型是产品类型,因此当它们延伸到一行时,它们的读取效果不好。考虑到这一点,如果有一种流行的方法来处理此类问题而无需换行符和制表符,那也可以解决我的问题。

最佳答案

我们可以使用 lines :: String -> [String] 来解决这个问题和 unlines :: [String] -> StringString 移动到 String 列表并返回。

在这之间,我们可以利用map :: (a -> b) -> [a] -> [b]在所有行前面添加一个制表符(StringChar 的列表),例如:

indent :: String -> String
indent = unlines . map ('\t' :) . lines

例如:

Prelude> indent (show (SndLevel 5))
"\tSndLevel: \n\t\t5\n"

我们可以在 SndLevelTopLevelShow 定义中使用它,如下所示:

instance Show SndLevel where
show (SndLevel n) = "SndLevel:" ++ '\n' : indent (show n)

instance Show TopLevel where
show (TopLevel n) = "TopLevel:" ++ '\n' : indent (show n)

这给了我们:

Prelude> print (TopLevel (SndLevel 5))
TopLevel:
SndLevel:
5

话虽如此,Show 通常用于显示通常可以“注入(inject)”回编译器/解释器的对象的表示形式。使用缩进的想法一点也不坏,但也许为此定义自己的类型类是有意义的。您可以通过使用传递和更新的参数来提高该类型类的效率,该参数跟踪缩进级别。

还有几个"pretty printing" libraries [Reddit]可以很好地打印物体的结构。因此,与其“重新发明轮子”,不如使用 Reddit 页面上列出的软件包之一。

关于string - 缩进字符串中的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56227989/

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