

foo(alpha(1), beta(2))
foo (alpha 1) (beta 2)

What if I told you there was no standard evaluation order?
foo (alpha 1) (beta 2)
alpha may be evaluated a bit, then beta, the alpha again...
If, say, the value of beta is never needed, beta will never be evaluated.
This way of doing things actually works in practice, because we're dealing with pure functions.
This allows for some interesting performance benefits.

class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> BoolThis says that type 'a' belongs to type class 'Eq' if there are functions named '==', and '/=', of the appropriate types, defined on it.
To put it another way, when we say a type has a type class we basically mean "all types which can do X are considered to have this type class"
sum :: Num a => [a] -> a
sum [] = 0
sum (x : xs) = x + sum xstype String = [Char]There's a lot more to Haskell I didn't cover.
You've got questions, Haskell has elegant answers, even if I don't.
This entire presentation was mostly cribbed from the Haskell Fundamentals course on Pluralsight by Benson Joeris.
Go watch that course. It's clearer and more exhaustive than this presentation.