Академический Документы
Профессиональный Документы
Культура Документы
Эффективный ML
Джон Харрисон
Университет Кембриджа
10 сентября 2008 г.
Темы
itlist f [x1 ; x2 ; . . . ; xn ] b
= f x1 (f x2 (f x3 (· · · (f xn b))))
Стек
Вот воображаемый снимок стека во время вычисления последнего
вызова fact, т.е. во время вычисления fact 0:
n=6
n=5
n=4
n=3
n=2
n=1
n=0
SP -
Заметим, что используется порядка n фреймов стека, когда у нас n
вложенных рекурсивных вызовов. Во многих ситуациях это очень
расточительно.
Джон Харрисон Введение в Функциональное программирование
Лекция 8. Эффективный ML
Хвостовая рекурсия
Теперь, в противопоставление старому определению, рассмотрим
следующее определение функции факториала:
#l e t r e c t f a c t x n =
i f n = 0 then x
else tfact (x ∗ n) (n − 1 ) ; ;
t f a c t : i n t −> i n t −> i n t = <fun>
#l e t f a c t n = t f a c t 1 n ; ;
f a c t : i n t −> i n t = <fun>
#f a c t 6 ; ;
− : i n t = 720
написав
fun [ ] −> [ ]
| ( h : : t as l ) −> i f h < 0 then t e l s e l ; ;
Джон Харрисон Введение в Функциональное программирование
Лекция 8. Эффективный ML
Исключения (1)
Все ошибки ML, например неудавшиеся сопоставления или деление
на ноль, сигнализируются посредством распространяющихся
исключений:
#1 / 0 ; ;
Uncaught e x c e p t i o n : D i v i s i o n _ b y _ z e r o
Исключения (2)
Исключения (3)
Ссылки (1)
Ссылки (2)
Вот пример создания и использования ссылки:
#l e t x = r e f 1 ; ;
x : int ref = ref 1
#!x ; ;
− : int = 1
#x := 2 ; ;
− : unit = ()
#!x ; ;
− : int = 2
#x := ! x + ! x ; ;
− : unit = ()
#x ; ;
− : int ref = ref 4
#!x ; ;
− : int = 4
Массивы (1)
Массивы (2)
Вот простой пример:
#l e t v = make_vect 5 0 ; ;
v : int vect = [ | 0 ; 0; 0; 0; 0 | ]
#v e c t _ i t e m v 1 ; ;
− : int = 0
#v e c t _ a s s i g n v 1 1 0 ; ;
− : unit = ()
#v ; ;
− : i n t vect = [ | 0 ; 10; 0; 0; 0 | ]
#v e c t _ i t e m v 1 ; ;
− : i n t = 10