Haskell, 08 лекция (от 16 ноября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

что такое контейнерный тип? Это ТД, могущий содержать значения других типов. Простейший вариант — Maybe:

data Maybe a = Just a | Nothing

А какой тип будет у этого выражения:

Just 10

?

Num t >> Maybe t

класс функтор:

class Functor f where
  fmap :: (a → b) → f a → f b
instance Functor [] where
  fmap f(x,t) = (f x): (f(x): fmap f t)

Что здесь не так? Не хватает реализации для пустого списка:

fmap f [] = []

...

Побочные результаты. Допустим, есть такой студенческий способ отладки, как отладочная печать. Но как её исплозовать в функциональном языке? Рассмотрим пример

f, g :: Int → Int
f = (+)1
g = (+)3

Собственно, не остаётся ничего иного, как завернуть эти функции в другие:

f', g' :: int → (Int, String)
f' x = (fx, "f ")
g' x = (gx, "g ")

Но, понятно, что напрямую их использовать в композиции fg не удастся. Поэтому, для того, чтобы получить композицию, придётся пичсать что-то в духе:

let (i, s) = f' n in
  let (i2, s2) = f'i in
    (i2, s ++ s2)

...

Задание ...

bind :: (Int → (Int, String)) → (Int, String) → (Int, String)

Должно получиться что-то в духе

bind f' . g' 
> let h' = bind f' . g'
> h' 10
(14, "f g ")

Кроме этого, на тот случай, если просто есть функция, нужно имть нечто, что делает из чего-то типа f что-то типа f'. Назовём эту функцию unit:

unit :: (Int → Int) → (Int → (Int, String))
unit f

Ещё одно: реализация класса монад для некоего типа:

Debuggable a = a 7rarr; (a, String)

Лектор напомнит опр. класса Monad:

class Monad m where
  return :: a → m a
  (>>=) :: a → (a → m b) → m b
  (>>) :: m a → m b → m b

Задания:

  1. instance Functor []
  2. . Почему то, что было написано, не явл. правильным?
  3. instance Functor Maybe
  4. bind
  5. instance Monad Maybe

Лектор не говорит про законы Monad, и то, что реализация функций Monad должна удовл. нек-рым законам, это будет на след. лекции, и лектор хотел бы, чтобы слушатели сделали предп., каким законам должна уцдовл. функция вклассе Monad, понятно, что язык не требует и это джент. соглашения.


Теория функционального программирования. Язык Haskell


00 01 02 03 04 05 06 07 08 09 10 11 12


Календарь

Сентябрь
23 28
Октябрь
05 12 19 26
Ноябрь
02 09 16 23 30
Декабрь
07 14


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы