- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当在 haskell 中寻找一个可以压平任意深度嵌套列表的函数时,即递归应用 concat
并在最后一次迭代(使用非嵌套列表)时停止的函数,我注意到这个将需要有一个更灵活的类型系统,因为随着列表深度的变化,输入类型也会发生变化。事实上,有几个 stackoverflow 问题 - 例如 this一个 - 其中响应声明“不存在将‘查看’不同深度的不同嵌套列表的函数”。
编辑:一些答案在 haskell 中提供了解决方法,无论是针对自定义数据类型还是在 TypeFamilies
或 MultiParamTypeClasses
的帮助下(如下面 Noughtmare 的回答或答案由 post above 中的“Landei”或 this 帖子中的“John L”回答)。然而,这些族和类似乎也被引入,因为在 haskell 中缺少/来替代依赖类型(例如,haskell wiki 声明 “类型族是 [...] 很像依赖类型”.
我现在的问题是,haskell 是否确实最初不是为定义此类函数而设计的(例如,将不同深度的列表展平),此外,一旦移动,此类问题是否会消失到实现 dependent types 的语言? (例如 Idris、Agda、Coq,...)我没有使用这些语言的经验,这就是我问的原因。
例如,在 Idris 网站上,据说“类型可以作为参数传递给函数”,因此,我认为,在列表扁平化的情况下,可以简单地将列表的类型传递为参数并以直接的方式实现所需的功能。这可能吗?
后续问题也将是:在 haskell 中解决此问题的那些 Families 和 Classes 是否提供了 haskell 中依赖类型理论的完整实现,或者如果没有,有哪些重要区别?
最佳答案
你可以在 Haskell 中创建一个不需要指定输出类型的函数:
{-# LANGUAGE TypeFamilies, FlexibleInstances, FlexibleContexts #-}
type family FlatT a where
FlatT [[a]] = FlatT [a]
FlatT a = a
class Flat a where
flat :: a -> FlatT a
instance Flat [a] => Flat [[a]] where
flat xs = flat $ concat xs
instance {-# OVERLAPPABLE #-} FlatT a ~ a => Flat a where
flat x = x
main = print $ flat [["Hello"," "],["World", "!"]]
仍然存在的一个问题是您的列表中可能包含一个多态类型,它本身可能是一个列表。例如你可以写一个整数列表:
main = print $ flat [[1,2],[3,4,5]]
这会给出很多关于不明确变量的错误。一个简单的解决方法是向其中一个整数添加类型签名:[[1,2],[3,4,5::Int]]
。这将修复所有错误。从某种意义上说,这个错误对我来说是不可避免的,因为你可以这样写一个实例:
instance Num [Int] where
fromInteger n = replicate (fromInteger n) (fromInteger n)
然后你可以像这样使用它:
main = print $ [[1,2],[3,4,5 :: [Int]]]
哪个会返回:
[1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
如您所见,这会额外展开一层。因此,展开的层数取决于您在签名中提供的类型。对我来说,这听起来似乎无法避免类型签名,即使是在更强大的语言中也是如此。
关于haskell - 在依赖类型的函数式编程语言中扁平化列表更容易吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68880676/
我有一个 TeamCity (9.0.2) 构建配置,其中包含以下工件路径模式: App\Agent\**\bin\%env.Configuration%\** => Deployment\Agent
我在 src 目录中有一个具有嵌套文件结构的项目。到目前为止,我一直在使用 babel --out-dir lib src 。最近我想到了一个想法,让用户直接使用单独的文件,所以基本上我想改造这个结构
我有一个数据库表,其中三列对于这个问题至关重要: 组 ID,将行分组在一起 开始日期 结束日期 我想从此表中创建一个 View ,以便将具有相同分组 ID 的重叠日期间隔展平。 不重叠的日期间隔不得展
我有一个很大的 pandas 数据框,有 8 列和几个 NaN 值: 0 1 2 3 4 5 6 7 8 1 Google, Inc. (Date 11/07/20
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我想将 simd_float4x4 或 simd_float3x3 矩阵展平为单个浮点元素数组。 对于常规数组我会使用 let arr = [[1,2,3],[4,5,6],[7,8,9]] prin
我正在寻找一种 Pythonic 方式来获取 OrderedDict 的 .values 的并集,在 折叠组成值的列表之后。我希望结果是一维列表,根据自定义顺序排序。 我在做什么: from coll
这个问题在这里已经有了答案: How do I make a flat list out of a list of lists? (36 个答案) 关闭 9 年前。 所以我目前正在使用 mongoe
我有一个像这样的数组。 [{"title"=>"ga:browser=Internet Explorer", "dimensions"=>[{:browser=>"Internet Explorer"
我正在尝试使用 Tabulator 创建工单列表,数据通过 AJAX url 从工单系统导入为 JSON,如下所示。 { "results": [ {
我有两个函数,每个函数都返回 CompletebleFuture实例,我想 or它们变成一个有序且可短路的 future 。 public CompletableFuture doA(); publi
我需要在 mysql 中用逗号分隔值将非主键列展平为一行。让我们举一个简单的例子。有一个名为 stud_sub 的表,其中 stud_id 和 sub_id 作为复合主键。现在我想要一个表,其中 st
这个问题在这里已经有了答案: Comprehension on a nested iterables? (13 个答案) 关闭 4 个月前。 我最近在寻找一种将嵌套的 Python 列表展平的方法,
我在 C# 中有一个 json 对象(表示为 Newtonsoft.Json.Linq.JObject 对象),我需要将它扁平化为字典。让我用一个例子来说明我的意思: { "name": "t
有人可以帮我进行以下转换吗? 这里是输入的xml: My book 200 big Smith Wallace
在下面的代码中,x 是 Future[Future[Int]] 类型,我需要将其展平为 Future[Int] .这怎么可能? def times(a:Int, b:Int) = Future
我对 R 还很陌生,我正在尝试使用 aggregate对数据帧、每个主题和数据集中的每个指标执行一些时间序列整形。这很好用,但我发现结果不是很容易使用的格式。我希望能够将结果转换回与原始数据帧相同的格
我有一个项目,我需要填写预制的 PDF,我想到的最合乎逻辑的解决方案是将预制的 PDF 制作成 PDF 表单,以便输入值应该放在标签中,然后我可以查看 PDF 中的表单标签,并将它们与值字典对齐。 我
首先,我对 Azure 还很陌生。 我已使用 Web 角色成功将 ASP.NET MVC 3 Web 应用程序部署到 Azure。该应用程序使用 Entity Framework 和 SQL Azur
我试图将 XML 层次结构展平为文本节点,其中输出标记名称是每个文本节点路径上的连字符连接标记。我对 http://www.chilkatsoft.com/xml-samples/bookstore.
我是一名优秀的程序员,十分优秀!