将事物列表转换为子列表列表
Convert a list of things into a list of sublists
我想编写一个函数,将事物列表转换为子列表列表,每个子列表包含具有相同值的元素,当它们连接在一起时给出相同的列表。
所以 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 中的这个问题?
这个函数已经存在,这是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]]
当您寻找一个可能已经存在的函数时,检查 Hoogle 通常会很有成效。因为可以按类型搜索,所以不必知道调用的函数是什么。即使它不存在,这也是一个很好的练习,因为它会让你思考它应该有什么类型。
这里开始的简单类型是[a] -> [[a]]
,但是这次搜索yields no results。仔细想想,这是有道理的:如果没有某种方法来比较它们,就不能拆分任意对象的列表。
您可能会想到几种比较列表项的方法。一个明显的,因为你想对相等的项目进行分组,是 Eq。因此,您可以尝试搜索 Eq a => [a] -> [[a]]
,而这实际上会产生 group
。您可以类似地尝试 Ord a
,因为 Ord 是另一种比较事物的方法,但这不会产生任何结果。
最后,您可以尝试最通用的方法:接受一个谓词函数来指示在何处拆分列表。搜索 (a -> a -> Bool) -> [a] -> [[a]]
会得到 groupBy
,这是实现目标的另一种合理方式,尽管实际上比必要的更通用。
我想编写一个函数,将事物列表转换为子列表列表,每个子列表包含具有相同值的元素,当它们连接在一起时给出相同的列表。
所以 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 中的这个问题?
这个函数已经存在,这是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]]
当您寻找一个可能已经存在的函数时,检查 Hoogle 通常会很有成效。因为可以按类型搜索,所以不必知道调用的函数是什么。即使它不存在,这也是一个很好的练习,因为它会让你思考它应该有什么类型。
这里开始的简单类型是[a] -> [[a]]
,但是这次搜索yields no results。仔细想想,这是有道理的:如果没有某种方法来比较它们,就不能拆分任意对象的列表。
您可能会想到几种比较列表项的方法。一个明显的,因为你想对相等的项目进行分组,是 Eq。因此,您可以尝试搜索 Eq a => [a] -> [[a]]
,而这实际上会产生 group
。您可以类似地尝试 Ord a
,因为 Ord 是另一种比较事物的方法,但这不会产生任何结果。
最后,您可以尝试最通用的方法:接受一个谓词函数来指示在何处拆分列表。搜索 (a -> a -> Bool) -> [a] -> [[a]]
会得到 groupBy
,这是实现目标的另一种合理方式,尽管实际上比必要的更通用。