Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Int определён так:data Int = -33554432 | -33554431 | ... |-2 | -1 | 0 | 1 | 2 | 3 | ... | 33554431 | 33554432
Int — АТД, как и любые типы в Хаскеле.data List a = Nil | Cons a (List a)
data Struct = Struct Int (String->Int) String
bar = (+)
baz = (+ 1)
foo = div
(+) :: Num a => a -> a -> a
div :: Integral a => a -> a -> a
(/) :: Fractional a => a -> a -> a
Есть функция «+ 1», а что – там нет обычного инкремента?
succ :: Enum a => a -> a
safebaz a b = baz <$> a <*> b... (>>=) :: m a -> (a -> m b) -> m bТо есть если у нас есть функция увеличения числа на 1, мы можем ее совершенно прозрачно применить к целому списку чисел, получив на выходе другой список.
Я прав?
union из C/C++. Вместе с (встроенным в язык) pattern matching — сильно упрощает код, и уменьшает количество мест, где можно ошибиться. К монадам и функторам отношения не имеет.let foo = "oчень"
foo' = "названы"
baz = "беспорядочно"
bar = "функции"
quux = "сложно"
bar1 = "потому"
Было foo quux следить за кодом bar1, что bar foo' baz.
function fmap (f, x) {...}
function id (x) {return x}
function composition(f, g, x) {return f (g (x))}
fmap (id, x) == id (x)
fmap (composition(f, g), x) == composition(fmap(f,x), fmap(g,x))
Зачем нужны все эти функторы и монады?