70 likes | 392 Views
Синтаксис Haskell vs OCAML. OCAML let func x y = match x, y with | patt1 -> res1 | patt2 -> res2 … | pattN -> resN. Haskell func pattx_1 patty_1 = res1 func pattx_ 2 patty_ 2 = res 2 … func pattx_ N patty_ N = res N. match x with | patt1 when cond -> res1.
E N D
Синтаксис Haskell vs OCAML OCAML let func x y = match x, y with | patt1 -> res1 | patt2 -> res2 … | pattN -> resN Haskell func pattx_1 patty_1 = res1 func pattx_2 patty_2 = res2 … func pattx_N patty_N = resN match x with | patt1 when cond -> res1 func patt1 | cond = res1 x::x2 [1;2;3] ‘a list ‘a list -> ‘a list e as v x:x2 [1,2,3] [a] [a] -> [a] v @ e
Типы данных в Haskell • Integer – число бесконечной разрядности • Int – машинное целое • Char, Bool • Float, Double – 4 и 8 байт соответственно • data T = V1 | V2 | … | Vn • data Maybe a = Nothing | Some a • (OCAML: type ‘a maybe = Nothing | Some of ‘a) • data Tree a = Leaf a | Branch (Tree a) (Tree a) • (OCAML: type ‘a tree = Leaf of ‘a | Branch of (‘a tree * ‘a tree)
Классы в Haskell • Классы и типы данных – различные сущности в Haskell. • Классы объединяют типы данных (в т.ч. несуществующие на момент описания класса), на которых определен полиморфизм каких-либо функций • Можно описать новый тип данных, «причислить» его к классу и доопределить функции, требуемые спецификацией класса. • Спецификация класса ничего не говорит о внутреннем устроении типов данных. • Класс подобен интерфейсу Java.
Как используются классы • Eq – класс, поддерживающий сравнение • class Eq a where (==) :: a -> a -> Bool • element :: (Eq a) => a -> [a] -> Bool • element _ [] = False • element e (x:_) | e == x = True • element e (_:xs) = element e xs
Как используются классы • Num – класс числовых типов • Можно определить функцию, работающую только на типах данных, «выводимых» из Num: • f :: Num a => [a] -> [a] • f [] -> []f (x:xs) -> (x+1):(f xs)
Как определяются классы • class Num a => MyNum a my_operation :: a -> a -> a my_operation x y = abs (x – y) • my_func x y z = (my_operation x y) / (my_operation y z) • Компилятор «выведет» ограничение типа для аргументов my_func: • my_func :: (MyNum a) => a -> a -> a -> a • Не возбраняется и программисту давать сигнатуры функций, не дожидаясь помощи компилятора