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はリストの最後の要素から始まり、私のラムダ関数はそれをアキュムレーターリストの先頭に追加します。したがって、最初の要素として(0,0)を取得する必要があります。しかし、それは反対で、私は困惑しています。:(

また、小さな質問-このような質問にタグを割り当てるにはどうすればよいですか?

4

2 に答える 2

2

'X'の後に

    (0,[])

'0'の後、

    (0,[])

最初の「_」の後、

    (1,[(0,0)])

secont'_'の後、

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

3番目の'_'の後、

    (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は次のように定義されます

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

ラムダ関数を呼び出しましょう。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 に答える