Интересно, почему функция, ожидаемая словом слева, имеет подпись типа a -> b -> a
вместо b -> a -> a
. Есть ли конструктивное решение?
В Haskell, например, я должен написать foldl (\xs x -> x:xs) [] xs
, чтобы отменить список вместо более короткого foldl (:) [] xs
(что было бы возможно с b -> a -> a
). С другой стороны, существуют варианты использования, которые требуют стандартного a -> b -> a
. В Scala это может быть добавлено: xs.foldLeft(List.empty[Int]) ((xs, x) => xs:+x)
, которое может быть записано как xs.foldLeft(List.empty[Int]) (_:+_)
.
Проводится ли соразмерно больше случаев использования, требующих заданной сигнатуры типа вместо альтернативного, или существуют другие решения, которые привели к тому, что дизайн, оставшийся слева, имеет в Haskell и Scala (и, вероятно, много других языков)?