Why was function application chosen as default Haskell operator, not composition?
haskell
Solution
That could also be written `f (g 3)`.
Why is Haskell not a concatenative language?
Based on A History of Haskell, it was influenced by a variety of functional programming and lazy language experiments, including ML. As section 4, Syntax describes:
Currying
Following a tradition going back to Frege, a function of two arguments may be represented as a function of one argument that itself returns a function of one argument. This tradition was honed by Moses Sch ̈onfinkel and Haskell Curry and came to be called currying. Function application is denoted by juxtaposition and associates to the left. Thus, `f x y` is parsed `(f x) y`. This leads to concise and powerful code. For example, to square each number in a list we write `map square [1,2,3]`, while to square each number in a list of lists we write `map (map square) [[1,2],[3]]`. Haskell, like many other languages based on lambda calculus, supports both curried and uncurried definitions,
The concept of currying is so central to Haskell's semantics and the lambda calculus at its core that any other method of arrangement would interact poorly with the language.
Problem
Haskell syntax requires relatively noisy `f . g $ 3` compared to `3 g f` as in stack-oriented languages. What were main design arguments for this choice?