Introduction

Haskell is a purely functional programming language.

"In purely functional programming you don't tell the computer what to do as such but rather you tell it what stuff is. … You express that in the form of functions. … "

A Haskell function cannot have side effects other than mapping its input to an output as a mathematical function.

Haskell is lazy in that it does not compute anything until it have to in order to return a value.

Haskell is statically typed.
 Type inference allows deducing the appropriate type automatically by inference on compatibility between the inputs and outputs.
Starting out
Ready, set, go!

ghci
: The Glorious Glasgow Haskell Compilation System. Environment to interactively compile and run Haskell programs. Exit GHCi using:quit
. GHCi documentation. 
Notequal operator:
/=
. 
Compiletime error on incompatible types:
123 + "foobar"

Compile a program:
ghci> l:myprogram.hs
. 
'
is allowed in function name, e.g.foo'Bar
is a valid function name. 
Function names cannot begin with a lowercase letter.
An intro to lists

In Haskell, a strings is a lists of characters.

List and tuple syntax difference:
[1, 2]
,(1, "foobar")
. A tuple can contain elements of different types, while a list cannot. This bears some similarity with Python's lists and tuples. A difference is that in Python, lists are mutable but tuples are not. 
Concatenate operation:
[1, 2] ++ [3, 4]
,"foo" ++ "bar"
,['a', 'b'] ++ ['c', 'd']
. 
[https://en.wikipedia.org/wiki/Cons cons] operation
:
:Prelude> 'f' : "bar" "fbar" Prelude> 1: [3, 4] [1,3,4] Prelude>

If
"XXX...XXX"
is a very long string,"XXX...XXX" ++ "foobar"
will be slow. 
[1, 2, 3]
equals1 : 2 : 3 : []
. 
Take parts of a list:
[1, 3, 5, 7] !! 2
returns5
. Haskell lists uses [zerobased numbering](https://en.wikipedia.org/wiki/Zerobased_numbering ).take 2 [1, 3, 5, 7]
gives the third element5
.drop 2 [1, 3, 5, 7]
gives[1, 3, 7]
. Compare this to Mathematica{1,3,5,7}<span class="createlink"><a href="/pages/cgibin/ikiwiki.cgi?page=3&from=computing%2Fprogramming%2FLearn_You_a_Haskell_for_Great_Good_reading_note&do=create" rel="nofollow">?</a>3</span>
,Take[{1,3,5,7}, {3}]
,Drop[{1,3,5,7}, {3}]
. 
Test element membership in a list:
elem 3 [2, 4, 6]
and2 \
elem` [1, 3, 5, 7]`. 
[[1, 2], ["foo", "bar"]]
is invalid as the types of the elements of the two sublists are not same. 
Lists compare in lexicographical order. E.g.
[1, 3, 4] < [1, 4, 2]
. 
head [1, 2, 3]
,tail [1, 2, 3]
,init [1, 2, 3]
,last [1, 2, 3]
. Compare with Mathematica / Wolfram Langauge namings:First[{1,2,3}]
,Rest[{1,2,3}]
,Most[{1,2,3}]
,Last[{1,2,3}]

null [1, 2, 3]
,null []
Other side notes

One of the key features and advantanges of Haskell is its purity: all sideeffects are encapsulated in a monad.

[https://en.wikipedia.org/wiki/Algebraic_data type Algebraic data type]:
data List a = Nil  Cons a (List a)
data Tree = Empty  Leaf Int  Node Tree Tree
Tree
is a sum data type
a.k.a. tagged union.
Tree
is a recursive data
type.

Pattern matching in Haskell:
depth :: Tree > Int depth Empty = 0 depth (Leaf n) = 1 depth (Node l r) = 1 + max (depth l) (depth r)
References

https://ghcformacosx.github.io/

Search a Haskell function by desired type signature, e.g. https://www.haskell.org/hoogle/?hoogle=String+%3E+Int (And the desired function for turning an object to a
String
is possiblyread :: Read a => String > a
).