gpt4 book ai didi

haskell - 在 Haskell 中展平元组

转载 作者:行者123 更新时间:2023-12-04 14:37:09 26 4
gpt4 key购买 nike

在 Haskell 中,我们可以展平列表列表 Flatten a list of lists
对于元组的简单情况,我可以看到我们将如何展平某些元组,如下例所示:

flatten :: (a, (b, c)) -> (a, b, c)
flatten x = (fst x, fst(snd x), snd(snd x))

flatten2 :: ((a, b), c) -> (a, b, c)
flatten2 x = (fst(fst x), snd(fst x), snd x)
但是,我正在寻找一个函数,该函数接受任何嵌套元组作为输入并将该元组展平。
可以在 Haskell 中创建这样的函数吗?
如果不能创建,为什么会这样?

最佳答案

不,这真的不可能。有两个障碍需要清除。
首先是所有不同大小的元组都是不同的类型构造函数。 (,)(,,)彼此之间根本没有真正的关系,只是因为它们碰巧用相似的字符序列拼写。由于 Haskell 中有无数个这样的构造函数,如果一个函数对所有这些构造函数都做一些有趣的事情,就需要一个具有无限多个实例的类型类。哎呀!
第二,我们天真地对这样的函数有一些非常自然的期望,而这些期望是相互冲突的。假设我们设法创建了一个名为 flatten 的函数。 .如果孤立地看,以下任何一段代码乍一看似乎都很自然:

flattenA :: ((Int, Bool), Char) -> (Int, Bool, Char)
flattenA = flatten

flattenB :: ((a, b), c) -> (a, b, c)
flattenB = flatten

flattenC :: ((Int, Bool), (Char, String)) -> (Int, Bool, Char, String)
flattenC = flatten
但综合起来,似乎有点问题: flattenB = flatten如果两者都是 flattenA,则不可能是类型正确的和 flattenC是! flattenA 的两种输入类型和 flattenC与输入类型统一为 flattenB -- 它们都是对的,它们的第一个组成部分本身就是一对 -- 但是 flattenAflattenC返回具有不同组件数量的输出。总之,核心问题是我们写 (a, b)的时候,我们还不知道是否 ab本身是一个元组,应该“递归地”展平。
只要付出足够的努力,就可以进行足够多的类型级编程来组合一些有时适用于有限大小元组的东西。但它是 1. 大量的前期工作,2. 很少的长期编程效率返回,以及 3. 即使在使用站点也需要相当数量的样板。这是一个糟糕的组合;如果有使用站点样板,那么您不妨首先编写您关心的功能,因为无论如何这样做通常都很短。

关于haskell - 在 Haskell 中展平元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63414655/

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