200 likes | 380 Views
Язык 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.
E N D
Язык 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/index.html, 2008-02-04 • прочее
Реализации Среди прочих существуют две наиболее распространенные реализации • HUGS • GHC
Особенности • Строго типизированный чисто функциональный ЯП • Поддержка ленивых вычислений • Краткая (часто, рекурсивная) форма записи, основанная на формализме конструктивной математики • Всякое вычисление (интерпретация) + программа есть приближение функции f::S->T, где S,T некоторые типы • Значение есть элементарное выражение и каждое значение имеет тип • Функции высших порядков: функции это также значения, который выступают в роли аргументов и результатов других функций • Другие известные достоинства ФЯП (см. haskell.org)
Особенности ЯП dynamically typed pure functions higher-order functions statically typed type inference real-time immutable datastructures polymorphism overloading concurrency high performance distribution parameterized types lazy virtual machine Java reflection type classes object oriented compiler interpreter meta-programming Haskell unification C backtracking
Типовые задачи • Получение остаточной процедуры • Построение мат. описания функций • Определение динамических структур • Автоматическое построение значительной «части» программы • Доказательства свойства программы • Эквивалентная трансформация программ
Значения и выражения • Базовыми составляющими языка являются значения • Выражения образуются в результате применения (аппликации) функций к значениям (см. лямбда исчисление). Вычисления (редукция) продолжается до получения значений. • Prelude> 'c' • 'c' :: Char • Prelude> 3 • 3 :: Integer • Prelude> not True • False :: Bool • Prelude> 5>7 • False :: Bool • Prelude> 1+2 • 3 :: Integer
Условные выражения • Условное выражение является вычислимым выражением, а не ключевым словом императивной языковой конструкции (т.е. как бы возвращает результатв результате вычисления) 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
Ввод-вывод • 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)