Язык haskell
DESCRIPTION
Язык 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. - PowerPoint PPT PresentationTRANSCRIPT
Язык Haskell
Обзор
Eugeny L Yakimovitch Eugeny L Yakimovitch http://desk.by/~ewger 2008 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/index.html, 2008-02-04
• прочее
Реализации
Среди прочих существуют две наиболее распространенные реализации
• HUGS
• GHC
Особенности
• Строго типизированный чисто функциональный ЯП • Поддержка ленивых вычислений• Краткая (часто, рекурсивная) форма записи,
основанная на формализме конструктивной математики
• Всякое вычисление (интерпретация) + программа есть приближение функции f::S->T, где S,T некоторые типы
• Значение есть элементарное выражение и каждое значение имеет тип
• Функции высших порядков: функции это также значения, который выступают в роли аргументов и результатов других функций
• Другие известные достоинства ФЯП (см. haskell.org)
Особенности ЯП
polymorphism
higher-order functions
statically typed
parameterized types
overloading
type classes
object oriented
reflection
meta-programming
compiler
virtual machine
interpreter
pure functions
lazyhigh
performance
type inference
dynamically typed
immutable datastructures
concurrency
distribution
real-time
Haskell unification
backtracking
Java
C
Типовые задачи
• Получение остаточной процедуры
• Построение мат. описания функций
• Определение динамических структур
• Автоматическое построение значительной «части» программы
• Доказательства свойства программы
• Эквивалентная трансформация программ
Значения и выражения
• Базовыми составляющими языка являются значения• Выражения образуются в результате применения
(аппликации) функций к значениям (см. лямбда исчисление). Вычисления (редукция) продолжается до получения значений.
Prelude> 'c''c' :: Char
Prelude> 33 :: Integer
Prelude> not TrueFalse :: Bool
Prelude> 5>7False :: Bool
Prelude> 1+23 :: Integer
Условные выражения
• Условное выражение является вычислимым выражением, а не ключевым словом императивной языковой конструкции (т.е. как бы возвращает результат в результате вычисления)
Prelude> if 2>3 then 4 else 55 :: 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 Zerotype Two = Succ Onetype Three = Succ Twotype Four = Succ Three---------------------------------------------------------------------------------- Функции для динамического представления чисел от 1 до 4 (для примера).
zero = undefined :: Zeroone = undefined :: Onetwo = undefined :: Twothree = undefined :: Threefour = undefined :: Four
---------------------------------------------------------------------------------- Класс для представления операции сложения (в механизме
вывода типов).
class Add a b c | a b -> c where add :: a -> b -> c---------------------------------------------------------------------------------- Экземпляры класса Add для представления операции сложения.
instance Add Zero b binstance 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 Zeroinstance (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 Oneinstance (Fac n k, Mul (Succ n) k m) => Fac (Succ n) m
Ввод-вывод
• Writes baz to the file called foo.
• No result displayed—wonder why not?
Prelude> writeFile "foo" "baz"
Prelude>
Пример ввода-вывода
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)