我使用的有关foldr相似的字词进行过滤的高清音质方程式的推理?
-
25-09-2019 - |
题
很好,这是用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]
。
在结束: - 。)
我是对我的所有动作?结果 非常感谢: - )
。 P.S。 myFilter
的定义是从书的真实世界哈斯克尔的,在章4。
解决方案
这看起来我的权利在第一次读取。
要记住,虽然重要的是,为了达到延迟计算,哈斯克尔实际上看待事物的另一种方式。换句话说,真实的序列更像
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
是严格的。但是,如果你想起来我上面列出的方式,它是有道理的(对我来说,反正)。
其他提示
只是为了扩大懒评价顺序:基本上哈斯克尔始终计算功能第一,不看参数,直到它有
如果使用呼叫myFilter
的结果(例如印刷),该函数将被按照以下顺序进行评价:
myFilter odd [1,2,3,4]
首先,myFilter
功能评价:
foldr step [] [1,2,3,4]
现在foldr
是最外面的功能和获取评估:
step 1 (foldr step [] [2,3,4])
现在step
获取评估产生1
,由于1
是奇数:
1 : foldr step [] [2,3,4]
现在的结果列表的第一个元素是可用的,并且可以通过调用函数中使用。如果主叫功能还使用以下元素评估继续
与foldr
:
1 : step 2 (foldr step [] [3,4])
step
的现在的评估不产生任何新的内容,因为2是偶数:
1 : foldr step [] [3,4]
因此foldr
再次:
1 : step 3 (foldr step [] [4])
现在评估step
产生3
:
1 : 3 : foldr step [] [4]
评估foldr
;
1 : 3 : step 4 (foldr step [] [])
和step
一次:
1 : 3 : foldr step [] []
最后foldr
计算结果为空列表:
1 : 3 : []
乍一看,你拍你的具体的例子来看一下步骤逐一纠正。不过,我想指出的是,这两个filter
和foldr
可以有效地应用到的无限列表的 - 这应该表明,你的步骤的顺序不正确,就哈斯克尔而言