Защо трябва да обичаме Haskell?

<- Радослав Георгиев

  • Хак България

  • ФМИ, КН, 6ти курс

  • Обичам езиците за функционално програмиране!

Имам 3 основни цели с тази презентация:

  1. Да се замислите как пишете код.

  2. Да разцъкате Haskell.

  3. Да станете по-добри програмисти.

Кой ще победи между акула и горила?

  • C# vs. Java

  • JavaScript vs. Python

  • PHP vs. света

Няма да боря езици.

Haskell е различен.

Haskell е странен.

Haskell е като чаровен психопат.

Става на въпрос за косвено учене!

  • Няма да пишете уеб на Haskell.

  • Няма да пишете enterprise на Haskell.

  • Обаче ако пишете на Haskell, ще станете по-добри на всеки друг език, който пишете!

Какво е Haskell?

  • Статично типизиран език,

  • за функционално програмираме,

  • с чисти функции

  • и без странични ефекти

Какво е Haskell?

  • Нямаме променливи.

  • Нямаме for-цикли.

inc x = x + 1

Чисти функции.

  • Винаги връщат резултат.

  • Извикани 2 пъти с едни и същи аргументи, дават един и същи резултат.

  • Всичко е immutable. Не може да се променят аргументите.

  • Не променят глобален state.

Пример за нечиста функция?

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Пример за нечиста функция?

var a = 5

function inc(x) {
  a += 1;
  return a + x;
}

В Haskell, всяка функция има типова декларация.

inc :: Int -> Int
replaceAll :: String -> String -> String
names :: String
lines :: String -> [String]
unlines :: [String] -> String

Да напишем малко код!

  • sumList :: [Int] -> Int

  • fact :: Int -> Int

  • first :: [a] -> a

  • member - проверява дали елемент е в списък.

Каква е типовата декларация на member?

member :: Eq a => a -> [a] -> Bool

Eq е типов клас.

  • Нещо като Interface

  • Типовите класове са кошница за типове.

  • Всеки тип в Eq, може да прави == и /= помежду си.

  • Може да си създадете нов тип и да го вкарате в Eq => member ще работи за него.

Type Inference

  • По време на компилация, за всяка функция се знае типовата сигнатура.

  • Като var в C# или auto в C++

  • Като новите неща в Java 8.

Имаме следната функция:

function makeName(family, first) {
    return first + " " + family;
}
console.log(makeName("Nakov")) // ??

Дайте да го видим на Haskell!

Curried functions

add3 a b c = a + b + c
add3 1 2 3 == (((add 1) 2) 3)

Ако извикаме функция с по-малко аргументи, получаваме нова функция на останалите.

Защо пишем for-цикли?

В езици като Haskell имаме функции от по-висок ред.

map (+1) [1 .. 10]

map на JS

function map(f, items) {
  var result = [];
  
  items.forEach(function(item) {
    result.push(f(item));
  });

  return result;
}
f . g = h
f.g=h

Композиция на функции

h(x) = f(g(x))
h(x)=f(g(x))

Композиция на JS

function compose(f, g) {
  return function(x) {
    return f(g(x));
  }
}

В Haskell, композицията е "синтаксис".

(.) :: (b -> c) -> (a -> b) -> a -> c

Хайде да се развихрим!

Ако съм ви заинтригувал, пишете ми на radorado@hackbulgaria.com

deck

By Hack Bulgaria

deck

  • 1,607