Академический Документы
Профессиональный Документы
Культура Документы
2 октября 2009 г.
Лоренс Паулсон
Подведение итогов
quickSort ([]) = []
quickSort ([ h : t ]) = quickSort (n | n t , n <= h ) + [ h ] + q u i c k S o r t (n | n t , n > h)
quickSort [] = []
quickSort (h : t ) = quickSort [y | y <− t , y < h ] ++ [ h ] ++ q u i c k S o r t [y | y <− t , y >= h ]
s q u a r e (N) = N ∗ N
s q u a r e L i s t = map ( s q u a r e , [1 , 2, 3, 4])
Решаемые задачи
Справочный материал
ISWIM (If you See What I Mean). Функциональный язык-прототип. Разработан Ландиным в 60-х
годах XX века для демонстрации того, каким может быть язык функционального
программирования. Вместе с языком Ландин разработал и специальную виртуальную машину для
исполнения программ на ISWIM’е. Эта виртуальная машина, основанная на вызове-по-значению,
получила название SECD-машины. На синтаксисе языка ISWIM базируется синтаксис многих
функциональных языков. На синтаксис ISWIM похож синтаксис ML, особенно Caml. Scheme.
Диалект Lisp’а, предназначенный для научных исследований в области computer science. При
разработке Scheme был сделан упор на элегантность и простоту языка. Благодаря этому язык
получился намного меньше, чем Common Lisp.
Справочный материал
Caml Light и Objective Caml. Как и Standard ML принадлежит к семейству ML. Objective Caml
отличается от Caml Light в основном поддержкой классического объектно-ориентированного
программирования. Также как и Standard ML строгий, но имеет некоторую встроенную поддержку
отложенных вычислений.
caml.inria.fr - институт INRIA. Домашний сайт команды разработчиков языков Caml Light и Objective
Caml. Можно бесплатно скачать дистрибутив Objective Caml, содержащий интерпретатор,
компиляторы байт-кода и машинного кода, Yacc и Lex для Caml, отладчик и профайлер,
документацию, примеры. Качество компилированного кода у этого компилятора очень хорошее, по
скорости опережает даже Standard ML of New Jersey.
Список литературы
1 Хювёнен Э., Сеппенен И. Мир Lisp’а. В 2-х томах. М.: Мир, 1990.
2 Бердж В. Методы рекурсивного программирования. М.: Машиностроение, 1983.
3 Филд А., Харрисон П. Функциональное программирование. М.: Мир, 1993.
4 Хендерсон П. Функциональное программирование. Применение и реализация. М.: Мир,
1983.
5 Джонс С., Лестер Д. Реализация функциональных языков. М.: Мир, 1991.
6 Henson M. Elements of functional languages. Dept. of CS. University of Sassex, 1990.
7 Fokker J. Functional programming. Dept. of CS. Utrecht University, 1995.
8 Thompson S. Haskell: The Craft of Functional Programming. 2-nd edition, Addison-Wesley,
1999.
9 Bird R. Introduction to Functional Programming using Haskell. 2-nd edition, Prentice Hall
Press, 1998.
school : : Integer
s c h o o l = 366
p i H a l f : : Double
p i H a l f = 3.1415926536 / 2
Кортежи и функции
p a i r : : ( Double , D o u b l e )
pair = (2.7 , 3.14)
a t t r i b u t e s : : ( Char , ( I n t , I n t , I n t ) , B o o l )
a t t r i b u t e s = ( ’M’ , ( 1 7 , 4 , 1 9 5 5 ) , True )
s i n : : D o u b l e −> D o u b l e −− а р г у м е н т и р е з у л ь т а т типа D o u b l e
p l u s I n t : : I n t −> I n t −> I n t −− два а р г у м е н т а типа I n t , р е з у л ь т а т I n t
divMod : : ( I n t , I n t ) −> ( I n t , I n t ) −− а р г у м е н т и р е з у л ь т а т − кортежи
3 + 8 и (+) 3 8
27 ‘ d i v ‘ 4 и d i v 27 4
7 ‘ p l u s I n t ‘ 11 и p l u s I n t 7 11
f a c t o r i a l : : I n t e g e r −> I n t e g e r
f a c t o r i a l n | n == 0 = 1
| n > 0 = n ∗ ( f a c t o r i a l ( n −1))
factorial 3
3 ∗ ( f a c t o r i a l (3 −1))
3 ∗ ( f a c t o r i a l 2)
3 ∗ (2 ∗ ( f a c t o r i a l (2 −1)))
3 ∗ (2 ∗ ( f a c t o r i a l 1))
3 ∗ (2 ∗ (1 ∗ ( f a c t o r i a l (1 −1))))
3 ∗ (2 ∗ (1 ∗ ( f a c t o r i a l 0 ) ) )
3 ∗ (2 ∗ (1 ∗ 1))
6
f1 = f2 = 1
f n = f n −1 + f n −2 при n > 2
– Вычисление числа Фибоначчи, заданного порядковым номером
fib : : I n t e g e r −> I n t e g e r
fib 1 = 1
fib 2 = 1
fib n = f i b ( n−1) + f i b ( n−2)
fib 6
fib 5 + fib 4
( f i b 4 + f i b 3) + f i b 4
( ( f i b 3 + f i b 2) + f i b 3) + f i b 4
( ( ( f i b 2 + f i b 1) + f i b 2) + f i b 3) + f i b 4
( ( ( 1 + 1) + 1) + ( f i b 2 + f i b 1)) + f i b 4
(3 + 2) + ( f i b 3 + f i b 2)
(3 + 2) + ( ( f i b 2 + f i b 1) + 1)
(3 + 2) + ((1 + 1) + 1)
8
fib : : I n t e g e r −> I n t e g e r
f i b ’ ␣ ␣ : : ␣ I n t e g e r ␣−>␣ I n t e g e r ␣−>␣ I n t e g e r ␣−>␣ I n t e g e r ␣−>␣ I n t e g e r
fib ’ n k f k f k 1 | k == n = f k
| k < n = f i b ’ ␣ n ␣ ( k +1) ␣ ( f k+f k 1 ) ␣ f k
f i b ␣ 1 ␣=␣ 1
f i b ␣ n ␣=␣ f i b ’ n 2 1 1
fib 6
fib ’ ␣6␣2␣1␣1
fib ’ 6 3 2 1
fib ’ ␣6␣4␣3␣2
fib ’ 6 5 5 3
fib ’ ␣6␣6␣8␣5
8
factorial : : I n t e g e r −> I n t e g e r
factorial 0 = 1
f a c t o r i a l n = n ∗ f a c t o r i a l ( n−1)
factorial : : I n t e g e r −> I n t e g e r
f a c t o r i a l ’ ␣ : : ␣ I n t e g e r ␣−>␣ I n t e g e r ␣−>␣ I n t e g e r
f a c t o r i a l ␣ n ␣=␣ f a c t o r i a l ’ n 1 −− ( f a c t o r i a l ’ ␣ n ␣ f ) ␣==␣ ( f ␣∗␣ n ! )
f a c t o r i a l ’ n f | n == 0 = f
| n > 0 = f a c t o r i a l ’ ␣ ( n −1)␣ ( n∗ f )
Типы списков
[ Integer ] −− список из целых чисел : [ 1 . . 1 0 ]
[ Char ] −− список из символов ( с т р о к а : " L i s t " == [ ’ L ’ , ’ i ’ , ’ s ’ , ’ t ’ ] )
[ ( Char , I n t ) ] −− список из кортежей : [ ( ’ L ’ , 1 ) , ( ’ i ’ , 2 ) , ( ’ s ’ , 3 ) ]
[[ Int ]] −− список из списков : [ [ 1 , 2 ] , [ 3 , 5 . . 1 0 ] , [ ] ]
Функция суммирования элементов списка
sumList :: [ I n t e g e r ] −> I n t e g e r
sumList [ ] = 0
sumList ( x : s ) = x + sumList s
sumList [1 , 3 , 6]
1 + sumList [3 , 6]
1 + 3 + sumList [ 6 ]
1 + 3 + 6 + sumList []
10
factorial :: I n t e g e r −> I n t e g e r
p r o d L i s t ’ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ : : ␣ ␣ [ I n t e g e r ] ␣−>␣ I n t e g e r ␣−>␣ I n t e g e r
f a c t o r i a l ␣n␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣=␣ ␣ p r o d L i s t ’ [ 1 . . n ] 1
p r o d L i s t ’ ␣ [ ] ␣p␣ ␣ ␣ ␣ ␣ ␣=␣ ␣p
p r o d L i s t ’ ( x : l s ) p = p r o d L i s t ’ ␣ l s ␣ ( p∗ x ) ␣ ␣ ␣ ␣ ␣−−␣ концевая ␣ р е к у р с и я
Несколько стандартных операций над списком и их определения.
1. Операция создания пары - prefix (x, y) = x : y = [x | y]. Эта операция также называется
конструктором или составителем.
2. Операция отсечения головы - head (x) = h (x). Это первая селективная операция.
3. Операция отсечения хвоста - tail (x) = t (x). Это вторая селективная операция.
head : : [ a ] −> a
head ( x : l s ) = x
head [ ] = e r r o r " head : ␣ empty ␣ l i s t "
tail :: [ a ] −> [ a ]
tail (x : ls ) = ls
tail [] = e r r o r " t a i l : ␣ empty ␣ l i s t "
length : : [ a ] −> I n t
length (x : l s ) = 1 + length ls
length [ ] = 0
null : : [ a ] −> B o o l
null (x : ls ) = False
null [] = True
init : : [ a ] −> [ a ]
init [] = e r r o r " i n i t : ␣ empty ␣ l i s t "
init [x] = []
init (x : ls ) = x : init ls
reverse : : [ a ] −> [ a ]
r e v e r s e ’ ␣ ␣ ␣ ␣ ␣ ␣ : : ␣ [ a ] ␣−>␣ [ a ] ␣−>␣ [ a ]
r e v e r s e ␣ l s ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣=␣ r e v e r s e ’ l s [ ]
r e v e r s e ’ ␣ [ ] ␣ l ␣ ␣ ␣ ␣ ␣ ␣=␣ l
reverse ’ (x : l s ) l = reverse ’␣ ls ␣(x : l )
Использование синонимов
find : : S t r i n g −> Char −> I n t
find [] _ = −1
f i n d ( x : s ) y | x == y = 0
| otherwise = 1 + find s y
swap : : P a i r a −> P a i r a
swap ( x , y ) = ( y , x )
Определение конструкторов
Конструкторы с параметром
d a t a Coord = Coord D o u b l e D o u b l e
data Pair a = Pair a a
myTree :: T r e e Char
myTree = Node ( Node
( Node Empty ’D ’ Empty )
’B ’
Empty )
’A ’
( Node
( Node Empty ’E ’ Empty )
’C ’
( Node Empty ’ F ’ Empty ) )
height :: T r e e a −> I n t
h e i g h t Empty = 0
h e i g h t ( Node t 1 _ t 2 ) = 1 + max ( h e i g h t t 1 ) ( h e i g h t t 2 )
build [] = Empty
build (e : ls ) = insert e ( build ls )
sqr :: I n t e g e r −> I n t e g e r
sqr x = x ∗ x
source = [1 , 2 , 5, 7, 11]
sqr
dest = [ 1 , 4 , 25 , 49 , 121]
dest = map s q r s o u r c e
map _ [ ] = []
map f ( x : l s ) = ( f x ) : ( map f l s )
1+2+5+7+11+0=26
func = ( : )
seed = [ ]
search 5 [1 , 2 , 5 , 7 , 11]
foldr ( | | ) F a l s e ( map ( \ x −> x == 5 ) [ 1 , 2 , 5 , 7 , 1 1 ] )
foldr ( | | ) F a l s e [ F a l s e , F a l s e , True , F a l s e , F a l s e ]
False | | ( F a l s e | | ( True | | ( F a l s e | | ( F a l s e | | F a l s e ) ) ) )
True
reverse :: [ a ] −> [ a ]
reverse list = f o l d l app [ ] l i s t
w h e r e app l x = x: l
reverse :: [ a ] −> [ a ]
reverse list = foldl ( flip (:)) [] list
−− Альтернативный в а р и а н т
comp :: ( b −> c ) −> ( a −> b ) −> ( a −> c )
(.) :: ( b −> c ) −> ( a −> b ) −> ( a −> c )
comp f g = f g where f g x = f ( g x )
f . g = f g where f g x = f ( g x )
sqr :: (Num a ) => a −> a
sqr :: (Num a ) => a −> a
sqr a = a ∗ a
sqr a = a ∗ a
power4 :: (Num a ) => a −> a
power4 :: (Num a ) => a −> a
power4 = comp s q r s q r
power4 = sqr . sqr
d a t a T r e e a = Empty |
Node ( T r e e a ) a ( T r e e a )
f o l d T r e e (++) s e e d t 1 =>
D ++ (B ++ (A ++ ( E ++ (C ++ ( F ++ s e e d ) ) ) ) )
d a t a T r e e a = Empty |
Node ( T r e e a ) a ( T r e e a )
sort : : ( Ord a ) => [ a ] −> [ a ]
build : : ( Ord a ) => [ a ] −> T r e e a
insert : : ( Ord a ) => a −> T r e e a −> T r e e a
f l a t t e n : : T r e e a −> [ a ]
sort ls = flatten ( build ls )
i n s e r t e Empty = Node Empty e Empty
i n s e r t e ( Node t 1 n t 2 ) | e < n = Node ( i n s e r t e t1 ) n t2
| e >= n = Node t1 n ( i n s e r t e t2 )
build [] = Empty
build (e : ls ) = insert e ( build ls )
f l a t t e n Empty = []
f l a t t e n ( Node t1 n t 2 ) = ( f l a t t e n t 1 ) ++ ( n : ( f l a t t e n t 2 ) )
−− Альтернативный в а р и а н т
foldTree :: ( a −> b −> b ) −> b −> T r e e a −> b
f o l d T r e e _ s e e d Empty = seed
f o l d T r e e f s e e d ( Node t 1 n t 2 ) = f o l d T r e e f ( f n ( f o l d T r e e f s e e d t 2 ) ) t 1