bene, questa è la definizione della funzione filtro utilizzando foldr:Sto usando il ragionamento equazionale del suono su una definizione di filtro in termini di foldr?
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
così per esempio diciamo che ho questo funzione:
myFilter odd [1,2,3,4]
quindi sarà:
foldr step [] [1,2,3,4]
e questo sarà
step 1 (foldr step [] [2,3,4])
.210
e questo sarà
step 1 (step 2 (foldr step [] [3,4]))
e questo sarà
step 1 (step 2 (step 3 (foldr step [] [4])))
e questo sarà
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
e foldr step [] []
è []
così:
step 1 (step 2 (step 3 (step 4 [])))
ora entreremo nella funzione step
.
Ecco la definizione della step
all'interno della funzione myFilter
, dall'alto:
step x ys | p x = x : ys
| otherwise = ys
anche, vi ricordo che p
è in realtà la funzione odd
nel nostro esempio.
bene, ancora una volta, siamo qui:
step 1 (step 2 (step 3 (step 4 [])))
e
x = 4
nella zona più interna step
, e 4
non è strano, così abbiamo tornando ys
, che è []
così ora otteniamo questo:
step 1 (step 2 (step 3 []))
ora, nella più interna step
, x = 3
, e 3
è dispari, così torniamo x:ys
, che è 3 : []
, che è [3]
, e ora otteniamo:
step 1 (step 2 [3])
e ora, in quello interno step
, x = 2
, e 2
non è strano, così torniamo ys
, che è [3]
, così ora noi otterrà:
step 1 [3]
e ora, x = 1
e 1
è dispari, quindi restituiamo x : ys
, che è 1 : [3]
, che è [1,3]
.
Fine :-).
ho ragione in tutte le mie mosse?
grazie mille :-).
p.s. la definizione di myFilter
proviene dal libro Real World Haskell, nel capitolo 4.
grazie per questo. beh, sono molto novizio in haskell, quindi non conosco tutti i "backstage" di haskell. ho solo bisogno di sapere se è semplicemente così. forse nei capitoli successivi del libro, discuteranno di quello che hai cercato di insegnarmi qui (che ho bisogno di leggere di più, per capirlo) grazie mille :-). – Elimelech
Penso che tu sia sulla strada giusta. Non chiamerei questo "back-end" tanto quanto capire come funziona la valutazione pigra. Per un caso semplice come questo non ha importanza, ma quando vedi che 'foldr' funziona su liste infinite e' foldl' no, questo ti aiuterà a capire perché. – Dan