【问题标题】:Convert a list of things into a list of sublists将事物列表转换为子列表列表
【发布时间】:2020-10-16 22:28:13
【问题描述】:

我想编写一个函数,将事物列表转换为子列表列表,每个子列表包含相同值的元素,当它们连接在一起时会给出相同的列表。

所以runs [1,2,2,1,3,3,3,2,2,1,1,4] 变成了[[1],[2,2],[1],[3,3,3],[2,2],[1,1],[4]]

如何在 Haskell 中解决这个问题?

【问题讨论】:

标签: list function haskell stack


【解决方案1】:

这个函数已经存在,这是group :: Eq a => [a] -> [[a]]

Prelude> import Data.List(group)
Prelude Data.List> group [1,2,2,1,3,3,3,2,2,1,1,4]
[[1],[2,2],[1],[3,3,3],[2,2],[1,1],[4]]

【讨论】:

  • 这非常简单。非常感谢
【解决方案2】:

在寻找可能已经存在的功能时,检查 Hoogle 通常会很有成效。因为您可以按类型搜索,所以您不必知道函数调用了什么。即使它不存在,它也是一个很好的练习,因为它让你思考它应该有什么类型。

这里,最简单的类型是[a] -> [[a]],但是这个搜索是yields no results。仔细想想,这是有道理的:如果没有某种方法来比较它们,就不能拆分任意对象的列表。

您可能会想到几种比较列表项的方法。一个明显的,因为你想对相等的项目进行分组,是 Eq。所以你可以尝试搜索Eq a => [a] -> [[a]],这实际上会产生group。您也可以类似地尝试 Ord a,因为 Ord 是另一种比较事物的方法,但这不会产生任何结果。

最后,您可能会尝试最通用的方法:接受一个谓词函数来指示在哪里拆分列表。搜索 (a -> a -> Bool) -> [a] -> [[a]] 会产生 groupBy,这是实现目标的另一种合理方式,尽管实际上比必要的更笼统。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多