Язык haskell

20
Язык Haskell Обзор Eugeny L Yakimovitch Eugeny L Yakimovitch http://desk.by/~ewger 2008 2008

Upload: kelsey-woodward

Post on 30-Dec-2015

25 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Язык  Haskell

Язык Haskell

Обзор

Eugeny L Yakimovitch Eugeny L Yakimovitch http://desk.by/~ewger 2008 2008

Page 2: Язык  Haskell

Литература

• 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

• прочее

Page 3: Язык  Haskell

Реализации

Среди прочих существуют две наиболее распространенные реализации

• HUGS

• GHC

Page 4: Язык  Haskell

Особенности

• Строго типизированный чисто функциональный ЯП • Поддержка ленивых вычислений• Краткая (часто, рекурсивная) форма записи,

основанная на формализме конструктивной математики

• Всякое вычисление (интерпретация) + программа есть приближение функции f::S->T, где S,T некоторые типы

• Значение есть элементарное выражение и каждое значение имеет тип

• Функции высших порядков: функции это также значения, который выступают в роли аргументов и результатов других функций

• Другие известные достоинства ФЯП (см. haskell.org)

Page 5: Язык  Haskell

Особенности ЯП

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

Page 6: Язык  Haskell

Типовые задачи

• Получение остаточной процедуры

• Построение мат. описания функций

• Определение динамических структур

• Автоматическое построение значительной «части» программы

• Доказательства свойства программы

• Эквивалентная трансформация программ

Page 7: Язык  Haskell

Значения и выражения

• Базовыми составляющими языка являются значения• Выражения образуются в результате применения

(аппликации) функций к значениям (см. лямбда исчисление). Вычисления (редукция) продолжается до получения значений.

Prelude> 'c''c' :: Char

Prelude> 33 :: Integer

Prelude> not TrueFalse :: Bool

Prelude> 5>7False :: Bool

Prelude> 1+23 :: Integer

Page 8: Язык  Haskell

Условные выражения

• Условное выражение является вычислимым выражением, а не ключевым словом императивной языковой конструкции (т.е. как бы возвращает результат в результате вычисления)

Prelude> if 2>3 then 4 else 55 :: Integer

Prelude> if if 1<2 then 3<2 else 4<5 then 'a' else 'b'?

Page 9: Язык  Haskell

Лямбда выражения

Для записи лямбда выражений в качестве символа греческой лямбда используется наклонная черта “\”

В качестве точки последовательность

“->”

> (\x -> \y -> x + y) 1 2

3

Page 10: Язык  Haskell

Функции и модули

module IntroExample

(someFunction)

Where

someFunction :: Int -> [Int] -> [Int]

someFunction n [] = []

someFunction n (x:xs) = (x + n) : someFunction n xs

-- n - число, которое необходимо прибавить к каждому элементу списка.

Page 11: Язык  Haskell

Вычисление типов

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

Page 12: Язык  Haskell

-------------------------------------------------------------------------------

-- Алгебраический тип, олицетворяющий значение 0.

data Zero

-------------------------------------------------------------------------------

-- Алгебраический тип, олицетворяющий следующее значение за заданным типом.

data Succ n

Page 13: Язык  Haskell

---------------------------------------------------------------------------------- Синонимы типов для представления чисел от 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

Page 14: Язык  Haskell

---------------------------------------------------------------------------------- Класс для представления операции сложения (в механизме

вывода типов).

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)

Page 15: Язык  Haskell

---------------------------------------------------------------------------------- Класс для представления операции умножения (в механизме

вывода типов).

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

Page 16: Язык  Haskell

---------------------------------------------------------------------------------- Класс для представления процесса вычисления факториала (в

механизме вывода-- типов).

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

Page 17: Язык  Haskell

Ввод-вывод

• Writes baz to the file called foo.

• No result displayed—wonder why not?

Prelude> writeFile "foo" "baz"

Prelude>

Page 18: Язык  Haskell

Пример ввода-вывода

module Main

where

import IO

main = do hSetBuffering stdin LineBuffering

doLoop

Page 19: Язык  Haskell

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

Page 20: Язык  Haskell

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)