Mi chiedo perché la funzione prevista dalla piega a sinistra abbia la firma del tipo a -> b -> a
anziché b -> a -> a
. C'è una decisione di progettazione dietro a questo?Perché fold left si aspetta (a -> b -> a) anziché (b -> a -> a)?
In Haskell, ad esempio, devo scrivere foldl (\xs x -> x:xs) [] xs
per invertire un elenco anziché il più breve foldl (:) [] xs
(che sarebbe possibile con b -> a -> a
). D'altra parte, ci sono casi d'uso che richiedono lo standard a -> b -> a
. In Scala, questo potrebbe essere aggiunto: xs.foldLeft(List.empty[Int]) ((xs, x) => xs:+x)
che può essere scritto come xs.foldLeft(List.empty[Int]) (_:+_)
.
In proporzione, più casi di utilizzo si verificano richiedendo la firma del tipo specificato anziché quella alternativa, o ci sono altre decisioni che hanno portato al design che fold ha lasciato in Haskell e Scala (e probabilmente in molte altre lingue)?
In altre parole, è necessario invertire l'ordine degli argomenti di '(:)' per invertire una lista. Ha senso per me. –
Nota che 'mapAccumL' e' mapAccumR' (da 'Data.List' /' Data.Traversable') hanno la stessa firma, sebbene funzionino anche in direzioni opposte. – leftaroundabout