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