Язык Haskell Обзор Eugeny L Yakimovitch
Литература Thompson S. Haskell: The Craft of Functional Programming. 2-nd edition, Addison-Wesley, Bird R. Introduction to Functional Programming using Haskell. 2-nd edition, Prentice Hall Press, Душкин Р. В. Функциональное программирование на языке Haskell. –М.:ДМК Пресс, 2007 Koen Lindstruem Claessen // ex.html, ex.html прочее
Реализации Среди прочих существуют две наиболее распространенные реализации 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 lazy high performance type inference dynamically typed immutable datastructures concurrency distribution real-time Haskell unification backtracking Java C
Типовые задачи Получение остаточной процедуры Построение мат. описания функций Определение динамических структур Автоматическое построение значительной «части» программы Доказательства свойства программы Эквивалентная трансформация программ
Значения и выражения Базовыми составляющими языка являются значения Выражения образуются в результате применения (аппликации) функций к значениям (см. лямбда исчисление). Вычисления (редукция) продолжается до получения значений. Prelude> 'c' 'c' :: Char Prelude> 3 3 :: Integer Prelude> not True False :: Bool Prelude> 5>7 False :: Bool Prelude> :: Integer
Условные выражения Условное выражение является вычислимым выражением, а не ключевым словом императивной языковой конструкции (т.е. как бы возвращает результат в результате вычисления) Prelude> if 2>3 then 4 else 5 5 :: Integer Prelude> if if 1
Лямбда выражения Для записи лямбда выражений в качестве символа греческой лямбда используется наклонная черта \ В качестве точки последовательность -> > (\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 Источник:
Алгебраический тип, олицетворяющий значение 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 displayedwonder 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 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