gpt4 book ai didi

haskell - 在 Haskell 中定义任意递归类型的 Show

转载 作者:行者123 更新时间:2023-12-02 10:03:39 24 4
gpt4 key购买 nike

我正在尝试将自定义类型设为 Show 的实例。

这里是 theType,它只是一个基本的 Set 类型。

data Set a = Insert a (Set a) | EmptySet

我想要类似的东西

Insert 1 (Insert 2 (Insert 3 EmptySet))

显示为

{1, 2, 3}

我该怎么做?我尝试使用字符串连接来实现,但似乎进行字符串插值被认为是不好的形式(Haskell 似乎本身并不支持这一点?)另外,如何获取列表周围的大括号?到目前为止,我能做的就是这个,它基本上什么也没做......

instance (Show a) => Show (Set a) where
show EmptySet = ""
show (Insert a as) = show a ++ show as

此外,我尝试使用 Hoogle 和 Hayoo 来查找 List 实现,以便我可以了解它是如何在 List 上实现的。我找不到它。有人对此有任何指示吗?我尝试搜索“show::[a]->String”、“Data.Lists”、“Lists”等...

最佳答案

这是一个直接递归的解决方案:

instance Show a => Show (Set a) where
show = ('{' :) . go
where
go EmptySet = "}"
go (Insert x EmptySet) = show x ++ "}"
go (Insert x xs) = show x ++ ", " ++ go xs

如果你不喜欢(++)的低效使用,你当然可以使用difference lists :

instance Show a => Show (Set a) where
show = ('{' :) . ($ []) . go
where
go EmptySet = ('}' :)
go (Insert x EmptySet) = shows x . ('}' :)
go (Insert x xs) = shows x . (", " ++) . go xs

应该可以了;那么,让我们测试一下:

> show (Insert 2 (Insert 3 (Insert 5 EmptySet)))
"{2, 3, 5}"

关于haskell - 在 Haskell 中定义任意递归类型的 Show,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540955/

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