Синтаксис haskell vs ocaml

6

Click here to load reader

Upload: charla

Post on 11-Jan-2016

53 views

Category:

Documents


6 download

DESCRIPTION

Синтаксис 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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Синтаксис  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

Page 2: Синтаксис  Haskell vs OCAML

Типы данных в 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)

Page 3: Синтаксис  Haskell vs OCAML

Классы в Haskell Классы и типы данных – различные сущности в

Haskell. Классы объединяют типы данных (в т.ч.

несуществующие на момент описания класса), на которых определен полиморфизм каких-либо функций

Можно описать новый тип данных, «причислить» его к классу и доопределить функции, требуемые спецификацией класса.

Спецификация класса ничего не говорит о внутреннем устроении типов данных.

Класс подобен интерфейсу Java.

Page 4: Синтаксис  Haskell vs OCAML

Как используются классы 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

Page 5: Синтаксис  Haskell vs OCAML

Как используются классы Num – класс числовых типов Можно определить функцию, работающую только

на типах данных, «выводимых» из Num: f :: Num a => [a] -> [a] f [] -> []

f (x:xs) -> (x+1):(f xs)

Page 6: Синтаксис  Haskell vs OCAML

Как определяются классы 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

Не возбраняется и программисту давать сигнатуры функций, не дожидаясь помощи компилятора