Download - Синтаксис Haskell vs OCAML
Синтаксис Haskell vs OCAML
OCAML
let func x y = match x, y with | patt1 -> res1 | patt2 -> res2 … | pattN -> resN
Haskell
func pattx_1 patty_1 = res1func 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 liste 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 -> amy_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
Не возбраняется и программисту давать сигнатуры функций, не дожидаясь помощи компилятора