- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个看似简单的 Haskell 问题,由于我的知识有限,我不确定要搜索什么术语才能解决它。
我试图解决 99 个 Haskell 问题中的第 8 个问题(从列表中删除连续的重复项),这就是我想出的:
compress :: (Eq a) => [a] -> [a]
compress list = compress' list ???
where
compress' [] _ = []
compress' (x:xs) last
| x == last = compress xs last
| otherwise = x : compress xs x
'???'只是一个占位符,这是我不确定该怎么做的地方。我想该片段的工作方式应该足够清楚,“last”是一种累加器,用于检查元素是否与之前的元素重复。现在,在这种情况下我可以给“last”什么初始值? (我想在大多数 OO 语言中类似于“null”)。
编辑:Tikhon 的回答有效,但我刚刚意识到我在原来的帖子中犯了一个错误,compress' 应该递归调用自身而不是压缩。因此,现在我的问题的“简单”解决方案是:
compress :: (Eq a) => [a] -> [a]
compress list = compress' list Nothing
where
compress' [] _ = []
compress' (x:xs) Nothing = x : compress' xs (Just x)
compress' (x:xs) (Just last)
| x == last = compress' xs (Just last)
| otherwise = x : compress' xs (Just x)
最佳答案
所以你的问题有两个答案。更直接的答案是,您可以使用 Maybe
来使某些东西可以为空,并且类型系统将确保您每次使用它时都检查它是否为 Nothing
:
compress list = compress' list Nothing
where compress' [] _ = []
compress' (x:xs) Nothing = x : compress xs (Just x)
compress' (x:xs) (Just last)
| x == last = compress xs last
| otherwise = x : compress xs (Just x)
这个故事的寓意是,如果您有一个可能缺失的元素(即在其他语言中可能是 null
),您可以将其包装在 Maybe
中。然后你要么有 Just x
要么有 Nothing
,你可以对它进行模式匹配,就像你对列表进行模式匹配一样。
但是,在这种特殊情况下,我们可以有一个更简洁的解决方案。请注意,该元素仅在第一次您调用compress'
时丢失。我们可以通过在处理这种可能性的顶级 compress
函数中添加一个 case 来处理这个问题:
compress [] = []
compress (x:xs) = x : compress' xs x
where ...
本质上,如果我们在顶层函数中处理它,我们就可以避免在我们的辅助 compress'
函数中处理大小写,我们可以匹配传入的列表来决定什么做。
关于haskell 初始累加器 'null' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799887/
我想用 c 编写基本计算器:我有累加器的问题(带有“+”和“-”运算符) int main(void) { float num1,num2,res; char operator;
我已经解决了 4clojure.com 上的 45 个问题,并且在尝试使用递归和累加器解决一些问题的方式中,我注意到一个反复出现的问题。 我会尽我所能解释我正在做的事情,以最终得到模糊的解决方案,希望
my_Stream 是我想要累积并分配给变量以供进一步处理的数据。我的问题:一旦流完成,如何将变量 the_string 的内容获取到 console.log? my_Stream.onValue(f
我很好奇,从这个代码片段中得到的平均值是多少?累加器旨在为空。 boost::accumulators::accumulator_set > Accumulator; int Mean = boost
在累积 struct timespec 增量的程序中,我正在执行以下逻辑: struct timespec accu, start, stop; for (...) { // record s
我正在尝试在数组上使用 foldLeft。例如: var x = some array x.foldLeft(new Array[Int](10))((a, c) => a(c) = a(c)+1)
由于没有找到在 C++ 中重置累加器的“boost ”方法,我遇到了一段似乎可以重置 boost 累加器的代码。但是不明白它是如何实现的。代码如下- #include #include #incl
这个问题在这里已经有了答案: Does a sequential stream in Java 8 use the combiner parameter on calling collect? (1
我正在实现一个需要递归调用才能获取所有数据的 API。我已经实现了一个具有 recursive transformer 的 Bloc 组件。但是,转换器似乎一直在递归调用中返回空累加器。 commen
我永远找不到 F# 核心库的源代码。我知道它应该是开放的,但谷歌在帮助我找到它时对我并不友好,如果是这样,我会查找 Seq.fold 的实现 - 但问题就在这里。 有没有人看到以下代码段有任何问题:
最近我学习了很多 Haskell,并想尝试一些它在 Python 中的巧妙技巧。据我了解,Python的reduce会自动将函数中的迭代变量和累加器设置为reduce中给出的列表的前两个值。在 Has
documentation boost 累加器的 error_of 特性说明它通过以下公式计算平均值的误差: 平方(方差/(计数 - 1)), 其中方差的计算方式是: variance = 1/cou
我正在使用 LongAccumulator 来计算我在 Cassandra 中保存的记录数。 object Main extends App { val conf = args(0) val
Spark 有一个有用的 API,用于以线程安全的方式积累数据 https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.
我想从任意长度的列表中选择任意数量的项目。下拉列表 (QComboBox) 不允许选中项目。如果有很多项目,可检查项目的列表会变得笨拙。 我找到了 this question在用户体验 SE 子站点和
是否可以在分组时通过集合收集字符串?这就是它在 Java 8 中的工作方式: Map discountOptions = p.getDiscountOptions().Stream() .
我是一名优秀的程序员,十分优秀!