Haskell похож на стандартную математическую запись. Многое можно понять просто вспомнив школьные уроки матана :-).
Функции задаются как набор записей:
имя образец_аргументов | условие = вычисление значения для этого образца.
Все имена обычных функций и других величин пишутся с маленькой буквы или знаками препинания не начинающимися с ':'. С большой буквы или с ':' пишутся конструкторы.
: - конструктор списка. x:y:[] - то же самое, что [x,y].
Все элементы списка должны иметь один тип.
В образцах можно "вызывать" конструкторы, но не функции. Имя с маленькой буквы в образце порождает новую величину, которая будет связана с этим именем. То есть образец (x:y) сопоставится с непустым списком, при этом голова списка попадет в "переменную" x, а остаток списка - в y.
По моему этого должно хватить.