如何找出给定元素存在的组的大小?

All*_*lan 3 haskell list

如果我有这样的列表:

lst = [4,4,4,5,3,3,9]
Run Code Online (Sandbox Code Playgroud)

我可以group用来创造这个:[[4,4,4],[5],[3,3],[9]].

如果我有一个指向列表的索引,例如,i = 4指向第一个3元素的索引,我怎样才能最好地编写一个带有列表和索引的函数,并返回索引指向的组的大小(在这种情况下, 2,3s组的长度)?

我知道我可以非常强制地写出来,并且我也可以将某些内容与某些内容联系起来map length . group并计算我在查找索引时通过的组数,但在我看来,必须有一个更好的方法来执行此操作.欢迎所有建议.

GS *_*ica 5

这是一个非常明确的解决方案,所以我可以解释每一步.

制作分组列表:

lst = [4,4,4,5,3,3,9]
lst1 = group lst
Run Code Online (Sandbox Code Playgroud)

接下来,用长度替换组:

lst2 = map length lst1
Run Code Online (Sandbox Code Playgroud)

这给了我们 lst2 = [3,1,2,1]

现在用长度列表替换长度,该列表也包含每个位置的长度:

lst3 = map (\l -> replicate l l) lst2
Run Code Online (Sandbox Code Playgroud)

现在我们有了lst3 = [[3,3,3],[1],[2,2],[1]],这几乎是我们需要的,但我们不想要内部结构:

lst4 = concat lst3
Run Code Online (Sandbox Code Playgroud)

现在我们有一些与原始列表相同的长度,但每个位置的组长度而不是原始值.所以lst4!!4 = 2.

该解决方案使用评论中的想法简化了我的原始解决方案.

正如该评论中指出的那样,还有一些调整是可能的 - 除了两个maps和concatas concatMap,并join在"简化" 的(->) r实例中使用,为整个管道提供:Monad\l -> replicate l l

concatMap (join replicate . length) . group $ lst
Run Code Online (Sandbox Code Playgroud)

  • 您可以组合这些阶段并将从"lst"到"lst4"的步骤(将每个元素替换为其组的大小)写为`concatMap(join replicate.length).group`(导入`Control.Monad(join)`). (2认同)