Haskell
И н с т р у к ц и я п о
п р и г о т о в л е н и ю
« Д о к а з а т е л ь с т в о - э т о
п р о г р а м м а , а д о к а з ы в а е м а я
ф о р м у л а - э т о т и п п р о г р а м м ы »
Х . К а р р и
Что такое
функциональное
программирование?
http://ru.wikipedia.org/wiki/
Функциональное_программирование
Слово о лени
ghci> take 24 [13,26..]
[13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,
234,247,260,273,286,299,312]
ghci> take 10 (cycle [1,2,3])
[1,2,3,1,2,3,1,2,3,1]
ghci> take 10 (repeat 5)
[5,5,5,5,5,5,5,5,5,5]
List comprehensions
let chunkyBacon xs =
[ if odd x then "chunky" else "bacon" | x <- xs, x < 100, x /= 0 ]
Do it yourself
ghci> let adjectives = ["Maverick","Natty","Lucid","Oneiric"]
ghci> let nouns = ["Lynx","Ocelot","Narwhal","Meerkat"]
["Maverick Meerkat","Natty Narwhal","Lucid Lynx","Oneiric
Ocelot"]
Help functions:
filter (> 0) <list>
Do it yourself
ghci> let full_list = [
if (head adj) == (head noun)
then adj ++ " " ++ noun
else "" |
adj <- adjectives, noun <- nouns]
ghci> filter (/= "") full_list
["Maverick Meerkat","Natty Narwhal","Lucid
Lynx","Oneiric Ocelot"
Tuples
Отличия кортежей от списков
Кортежи могут быть неоднородны
Кортежи имеют чётко заданную длину
Кортежи разной длины имеют разные типы
Немного о типах
ghci> :t 'a'
'a' :: Char ghci> :t [1,2,2]
[1,2,2] :: Num t => [t]
ghci> :t "hello"
"hello" :: [Char] ghci> :t 2.5
2.5 :: Fractional a => a
ghci> :t 1
1 :: Num a => a ghci> :t fst
fst :: (a, b) -> a
ghci> :t [1,2,2.5]
[1,2,2.5] :: Fractional t => [t]
Немного о типах
ghci> :t [1,2]
[1,2] :: Num t => [t]
ghci> :t [1,2,3]
[1,2,3] :: Num t => [t]
ghci> :t ("hello", "bacon")
("hello", "bacon") :: ([Char], [Char])
ghci> :t ("hello", "bacon", 515)
("hello", "bacon", 515) :: Num t => ([Char], [Char], t)
Lists of tuples
ghci> :t [(1,2),(8,11),(4,5)]
[(1,2),(8,11),(4,5)] :: (Num t1, Num t) => [(t, t1)]
ghci> :t [(1,2),(8,11,9),(4,5)]