Интересно, почему функция, ожидаемая словом слева, имеет подпись типа 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 (и, вероятно, много других языков)?