Язык 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)