作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,这是使用 foldr 的过滤器函数的定义:
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
myFilter odd [1,2,3,4]
foldr step [] [1,2,3,4]
step 1 (foldr step [] [2,3,4])
step 1 (step 2 (foldr step [] [3,4]))
step 1 (step 2 (step 3 (foldr step [] [4])))
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
foldr step [] []
是
[]
所以:
step 1 (step 2 (step 3 (step 4 [])))
step
功能。
step
的定义里面
myFilter
功能,从上面:
step x ys | p x = x : ys
| otherwise = ys
p
实际上是
odd
在我们的例子中起作用。
step 1 (step 2 (step 3 (step 4 [])))
x = 4
在最里面
step
, 和
4
不奇怪,所以我们返回
ys
,即
[]
step 1 (step 2 (step 3 []))
step
,
x = 3
, 和
3
是奇数,所以我们返回
x:ys
,即
3 : []
,即
[3]
,现在我们得到:
step 1 (step 2 [3])
step
,
x = 2
, 和
2
并不奇怪,所以我们返回
ys
,即
[3]
,所以现在我们将得到:
step 1 [3]
x = 1
, 和
1
是奇数,所以我们返回
x : ys
,即
1 : [3]
,即
[1,3]
.
myFilter
的定义来自书
Real World Haskell ,在第 4 章。
最佳答案
初读时这对我来说是正确的。
不过要记住的重要一点是,为了实现惰性求值,Haskell 实际上会以另一种方式看待事物。换句话说,真实的序列更像
step 1 (step 2 (step 3 (step 4 [])))
step 1 <block1>
[1, <block1>]
[1, step 2 <block2>]
[1, <block2>]
[1, step 3 (step 4 [])]
[1, step 3 <block3>]
[1, 3, <block3>]
foldr
开始,这对我来说是违反直觉的。似乎是从“由内而外”评估的,但
foldl
从
foldr
的“外在”进行评估会很懒(确实如此),而
foldl
是严格的。但是,如果您按照我上面概述的方式来思考它,那是有道理的(无论如何,对我来说)。
关于haskell - 我是否使用合理的等式推理来根据 foldr 定义过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185550/
我有一个曾经是 TreeView 控件的菜单,但现在我想让每个项目更加直观,并向树中的每个对象添加更多信息。 我的第一个意图是制作一个代表项目的用户控件,并在运行时将它们添加到面板中。这是一个好方法吗
我是 Docker 新手,想知道是否有可能(并且是一个好主意)在 Docker 容器中进行开发。我的意思是创建一个容器,执行 bash,安装和配置我需要的一切,然后开始在容器内进行开发。 容器将成为我
在 Java 中: Parent obj = new Child(); 我创建了一个 Parent 类型的对象。我假设我只能调用父类中定义的方法。因此,我无法调用 Child 中定义的“附加”方法或访
注意:我省略了其他两个阶段(V 和 W)的代码,示例中不需要。 我很确定,我这样处理“开”和“关”时间的方式并不是一种有效的方式。 我想使用查找表实现“开”和“关”脉动。计时器应与表的当前选定值进行比
当代码中包含 Java instanceof 运算符时,许多人会扬起眉毛并说这是禁忌。例如,在这个 other SO Q&A ,答案说: Note that if you have to use th
我是一名优秀的程序员,十分优秀!