Haskell, 08 лекция (от 16 ноября)
Материал из eSyr's wiki.
- Презентация: Media:ТФП -- Лекция 8.pdf
что такое контейнерный тип? Это ТД, могущий содержать значения других типов. Простейший вариант — 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
Задания:
- instance Functor []
- . Почему то, что было написано, не явл. правильным?
- instance Functor Maybe
- bind
- 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 |