Haskell. Обзор - Yauhen Yakimovich

advertisement
Язык Haskell
Обзор
Eugeny L Yakimovitch http://desk.by/~ewger 2008
Литература
• Thompson S. Haskell: The Craft of Functional
Programming. 2-nd edition, Addison-Wesley, 1999.
• Bird R. Introduction to Functional Programming using
Haskell. 2-nd edition, Prentice Hall Press, 1998.
• Душкин Р. В. Функциональное программирование на
языке Haskell. –М.:ДМК Пресс, 2007
• Koen Lindstruem Claessen //
http://www.cs.chalmers.se/Cs/Grundutb/Kurser/funht/ind
ex.html, 2008-02-04
• прочее
Реализации
Среди прочих существуют две наиболее
распространенные реализации
• HUGS
• GHC
Особенности
• Строго типизированный чисто функциональный ЯП
• Поддержка ленивых вычислений
• Краткая (часто, рекурсивная) форма записи,
основанная на формализме конструктивной
математики
• Всякое вычисление (интерпретация) + программа
есть приближение функции f::S->T, где S,T некоторые
типы
• Значение есть элементарное выражение и каждое
значение имеет тип
• Функции высших порядков: функции это также
значения, который выступают в роли аргументов и
результатов других функций
• Другие известные достоинства ФЯП (см. haskell.org)
Особенности ЯП
dynamically
typed
statically
typed
type
inference
higher-order
functions
real-time
immutable
datastructures
polymorphism
overloading
parameterized
types
lazy
concurrency
high
performance
reflection
type
classes
Haskell
pure
functions
object
oriented
unification
backtracking
distribution
virtual
machine
compiler
metaprogramming
C
Java
interpreter
Типовые задачи
•
•
•
•
Получение остаточной процедуры
Построение мат. описания функций
Определение динамических структур
Автоматическое построение
значительной «части» программы
• Доказательства свойства программы
• Эквивалентная трансформация
программ
Значения и выражения
• Базовыми составляющими языка являются значения
• Выражения образуются в результате применения
(аппликации) функций к значениям (см. лямбда
исчисление). Вычисления (редукция) продолжается
до получения значений.
Prelude> 'c'
'c' :: Char
Prelude> 5>7
False :: Bool
Prelude> 3
3 :: Integer
Prelude> 1+2
3 :: Integer
Prelude> not True
False :: Bool
Условные выражения
• Условное выражение является вычислимым
выражением, а не ключевым словом императивной
языковой конструкции (т.е. как бы возвращает
результат в результате вычисления)
Prelude> if 2>3 then 4 else 5
5 :: Integer
Prelude> if if 1<2 then 3<2 else 4<5 then 'a' else 'b'
?
Лямбда выражения
Для записи лямбда выражений в качестве
символа греческой лямбда
используется наклонная черта “\”
В качестве точки последовательность
“->”
> (\x -> \y -> x + y) 1 2
3
Функции и модули
module IntroExample
(someFunction)
Where
someFunction :: Int -> [Int] -> [Int]
someFunction n [] = []
someFunction n (x:xs) = (x + n) : someFunction n
xs
-- n
- число, которое необходимо прибавить
к каждому элементу списка.
Вычисление типов
module TypeInference
(Zero, Succ, One, Two, Three, Four, zero,
one, two, three, four, Add, Mul, Fac)
where
Источник: http://www.willamette.edu/~fruehr/haskell/evolution.html
-------------------------------------------------------------------------------- Алгебраический тип, олицетворяющий значение 0.
data Zero
-------------------------------------------------------------------------------- Алгебраический тип, олицетворяющий следующее
значение за заданным типом.
data Succ n
--------------------------------------------------------------------------------- Синонимы типов для представления чисел от 1 до 4 (для примера). Статическое
-- представление чисел по аксиоматике Пеано.
type One = Succ Zero
type Two = Succ One
type Three = Succ Two
type Four = Succ Three
--------------------------------------------------------------------------------- Функции для динамического представления чисел от 1 до 4 (для примера).
zero = undefined :: Zero
one = undefined :: One
two = undefined :: Two
three = undefined :: Three
four = undefined :: Four
--------------------------------------------------------------------------------- Класс для представления операции сложения (в механизме
вывода типов).
class Add a b c | a b -> c where
add :: a -> b -> c
--------------------------------------------------------------------------------- Экземпляры класса Add для представления операции сложения.
instance
Add Zero b b
instance Add a b c => Add (Succ a) b (Succ c)
--------------------------------------------------------------------------------- Класс для представления операции умножения (в механизме
вывода типов).
class Mul a b c | a b -> c where
mul :: a -> b -> c
--------------------------------------------------------------------------------- Экземпляры класса Mul для представления операции
умножения.
instance
Mul Zero b Zero
instance (Mul a b c, Add b c d) => Mul (Succ a) b d
--------------------------------------------------------------------------------- Класс для представления процесса вычисления факториала (в
механизме вывода
-- типов).
class Fac a b | a -> b where
fac :: a -> b
--------------------------------------------------------------------------------- Экземпляры класса Fac для представления процесса
вычисления факториала.
instance
Fac Zero One
instance (Fac n k, Mul (Succ n) k m) => Fac (Succ n) m
Ввод-вывод
Prelude> writeFile "foo" "baz"
Prelude>
• Writes baz to the file called foo.
• No result displayed—wonder why not?
Пример ввода-вывода
module Main
where
import IO
main = do hSetBuffering stdin LineBuffering
doLoop
doLoop = do putStrLn "Enter a command rFN wFN or q to quit:"
command <- getLine
case command of
'q':_
-> return ()
'r':filename -> do putStrLn ("Reading " ++ filename)
doRead filename
doLoop
'w':filename -> do putStrLn ("Writing " ++ filename)
doWrite filename
doLoop
_
-> doLoop
doRead filename = bracket (openFile filename ReadMode)
hClose
(\h -> do contents <- hGetContents h
putStrLn "The first 100 chars:"
putStrLn (take 100 contents))
doWrite filename = do putStrLn "Enter text to go into the
file:"
contents <- getLine
bracket (openFile filename WriteMode)
hClose
(\h -> hPutStrLn h contents)
Download