0

我在解释器上执行这个语句

foldr (\x (a, b) -> if x == '_' then (a+1, [((div a 3), (mod a 3))] ++ b) else (a, b)) (0, []) "_______OX"

我希望输出是

(7,[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2.0)])

但是输出是

(7,[(2,0),(1,2),(1,1),(1,0),(0,2),(0,1),(0,0)])

我究竟做错了什么。据我所知, foldr 从列表的最后一个元素开始,我的 lambda 函数将其附加到累加器列表的开头。所以我应该得到 (0,0) 作为第一个元素。然而,事实恰恰相反,我很困惑。:(

另外,一个小问题 - 我如何为这些问题分配标签?

4

2 回答 2

2

在'X'之后你有

    (0,[])

在'0'之后你有

    (0,[])

在第一个'_'之后你有

    (1,[(0,0)])

在第二个'_'之后你有

    (2,[(0,1),(0,0)]) -- you prepend in: [((div a 3), (mod a 3))] ++ b

在第三个'_'之后你有

    (3,[(O,2),(0,1),(0,0)])

...

于 2013-03-07T23:33:27.920 回答
0

让我们稍微简化一下,以便更好地解释:

foldr (\c (a,b) -> (a+1, a:b)) (0, []) "hi"

文件夹定义为

foldr f a [] = a
foldr f a (x:xs) = f x (foldr f a xs)

让我们调用 lambda 函数g 因此,上面的表达式的踪迹:

g 'h' (foldr g (0,[]) "i") 
g 'h' (g 'i' (foldr g (0,[]) ""))
g 'h' (g 'i' (0, []))
g 'h' (1, [0])
(2, [1,0])
于 2013-03-07T23:37:30.943 回答