list - Haskell 取列表的升序 (+1) 部分

标签 list haskell

我试图获取列表的初始化部分,而元素与之前的元素仅相差一个。一个简单的任务可以像这样实现:

takeAsc:: (Eq a, Enum a) => [a] -> [a]
takeAsc [] = []
takeAsc [x] = [x]
takeAsc (x:y:xs)
  |y == succ x = x: takeAsc(y:xs)
  |otherwise   = [x]

但这只会伤害我的感情。我相信,这是相当广泛使用的模式,我只是缺少一些特定的功能。我尝试过使用 groupBy 或 takeWhile,但看起来它们没有做我想要的事情。 有人能为此指出更优雅的解决方案吗?

最佳答案

您可以将其实现为

takeAsc [] = []
takeAsc xss@(x:xs) = (x:) $ map fst $ takeWhile (uncurry (==)) $ zip xs $ map succ xss

不过,您仍然必须包含这两种情况。

> takeAsc [1, 2, 3, 4]
[1, 2, 3, 4]
> takeAsc [1, 3, 4, 5]
[1]

如果您不喜欢它总是为非空列表返回至少 1 个元素,您将不得不使用上面的更详细的解决方案,但如果您要使用单行代码这是我能想到的最好的。

关于list - Haskell 取列表的升序 (+1) 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394509/

相关文章:

list - Racket:用列表中的元素绘制抛物线

python - 选择选择号码

javascript - 在javascript中计算html var中的元素

python - For循环堆栈和外部函数而不重复popleft()

haskell - 什么决定了 Haskell 中的数据构造函数顺序?

haskell - 浮点 SMT 逻辑比实际逻辑慢吗?

haskell - 将 requestAnimationFrame 转为 Event t()

python - python中的循环缩进

Haskell 为什么 "Num x"需要 "Show x"?

list - 输出一个元素我想要的次数