很好,这是用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 []))

现在,在最内stepx = 33为奇数,所以我们返回x:ys,这是3 : [],这是[3],现在我们得到:

step 1 (step 2 [3])

和现在,在内部stepx = 22不是奇数,所以我们返回ys,这是[3],所以现在我们将得到:

step 1 [3]

和现在,x = 11为奇数,所以我们返回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 : []

乍一看,你拍你的具体的例子来看一下步骤逐一纠正。不过,我想指出的是,这两个filterfoldr可以有效地应用到的无限列表的 - 这应该表明,你的步骤的顺序不正确,就哈斯克尔而言

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top