
Denis
22.07.2017
22:59:06
ana phi = Fix . fmap (ana phi) . phi
fromOneToTen = ana (\x -> if x == 10 then NilF else ConsF x (succ x)) 0
для параморфизма я еще не сделал диаграммы) только на А4 у меня

Google

kana
22.07.2017
23:01:20
Да, это понятно, интересно
Интересно в основном то, что такое не сделаешь с обычным списком

Denis
22.07.2017
23:02:09
на данный момент я потыкал это
— cata/cataM
— ana/anaM
— apo/apoM
— para/paraM
— hylo/hyloM

kana
22.07.2017
23:02:09
Из-за того, что там второй аргумент конса жестко указан в списоу

Denis
22.07.2017
23:02:35
мощь функтора это нечто
а особенно его алгебр
тут нет рекурсии
instance Show t => Show (List t) where
show = (<>"]") . ("["<>) . cata alg where
alg NilF = ""
alg (ConsF x []) = show x
alg (ConsF x xs) = show x <> "," <> xs
но будет показано как обычный списко а не яд из Fix(ListF a)
а товарищь Кметт сделал так, что можно вообще не парится с Fix и более общее там обобщение на рекурсивных схемах

kana
22.07.2017
23:05:55
https://hackage.haskell.org/package/fixplate-0.1.7/docs/Data-Generics-Fixplate-Morphisms.html

Denis
22.07.2017
23:06:03
вот моя подборка (переодически подкидываю) https://github.com/xgrommx/awesome-functional-programming/blob/master/rsfa.md
для меня это эталон)
https://github.com/ekmett/recursion-schemes/

Google

Vadim
22.07.2017
23:06:59
Народ, а ли в рамде какие-то встроенные возможности для кастомных операций над деревом? Ну или вообще рекурсивных операций? Например, если мне нужно перевести все листья дерева в upperCase, или получить массив из всех листьев любой глубины?

Denis
22.07.2017
23:07:10
там вместо Fix,unfix есть более общее понятие embed,project стоит только сделать представителем Recursion,Corecursion

Vadim
22.07.2017
23:07:52
просто например объекта с любой иерархической вложенностью

kana
22.07.2017
23:08:26
Да

Vadim
22.07.2017
23:08:26
не ограниченной

Denis
22.07.2017
23:08:32
https://github.com/xgrommx/practical-functional-programming/blob/master/tree.js
https://github.com/xgrommx/practical-functional-programming/blob/master/tree2.js
https://github.com/xgrommx/practical-functional-programming/blob/master/tree3.js

kana
22.07.2017
23:08:53
Скажем, map смотрит на наличие метода map
Все по спеке
Спека - fantasy land

Denis
22.07.2017
23:09:07

Дмитрий
22.07.2017
23:09:14

kana
22.07.2017
23:09:49
Это я про то, что рамда дает возможность работать с любыми типами, если для них определены нужные методы

Vadim
22.07.2017
23:09:52

Denis
22.07.2017
23:10:38

Vadim
22.07.2017
23:10:59
Это просто заполнение пробелов в знаниях по рамда )

kana
22.07.2017
23:11:55
Пишешь для своих типов метод map и рамда будет его использовать. Очевидно, что рамда не знает ничего про структуру твоих типов
А написать рекурсивный мап очень просто же

Vadim
22.07.2017
23:13:16

Google

Дмитрий
22.07.2017
23:13:26
Фигово что рамда не поддерживает Symbol.iterator

Denis
22.07.2017
23:13:54
@kana_sama
permutations' = sortByM (\_ _ -> [False, True])
subsequences' = filterM' (const [False, True])
inits' = takeWhileM' (const [False, True])
tails' = dropWhileM' (const [False, True])
а вот эти все **M я сделал через рекурсивные схемы

kana
22.07.2017
23:13:57
fl >> es)

Denis
22.07.2017
23:14:47
вот например takeWhileM
takeWhileM' :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
takeWhileM' p = cata psi where
psi = \case
Nil -> return []
Cons x xs -> do
flg <- p x
if flg then (x:) <$> xs else return []
хитрая алгебра) psi :: ListF a (m [a]) -> m [a]

kana
22.07.2017
23:16:04
Почему ты так не любишь паттерн-мечтинг через аргументы?)

Denis
22.07.2017
23:16:13
?

kana
22.07.2017
23:16:26
Лямбда-кейс конечно выглядит красиво, но...

Denis
22.07.2017
23:16:42

kana
22.07.2017
23:16:57
Но все же лямбда-кейс не в стандарте

Denis
22.07.2017
23:17:14
и ничего)
а вот то что ты сказал называется запись через уравнения

Denis
22.07.2017
23:20:32
foldr (\(head &&& length -> (k, v)) a -> (k ++ ":" ++ show v) : a) [] $ group $ sort ["a", "a", "b"]
кстати для катаморфизмов можно юзать фьюжн через композиции алгебр
@kana_sama
https://twitter.com/xgrommx/status/833793370547961856
и да) тут параморфизм)

Vadim
22.07.2017
23:49:34
Блин, я только сейчас, после чтения mostly-adequate-guide наконец-то понял что все что делает chain, это всего-лишь flatMap для объекта Chain (правда функции как оказывается этот метод тоже рассматривает как Chain)

Denis
22.07.2017
23:50:37
?

Дмитрий
22.07.2017
23:51:26

Google

Дмитрий
22.07.2017
23:51:31
Не?

Denis
22.07.2017
23:51:50
bind == flatMap == chain == (>>=)

Vadim
22.07.2017
23:55:39
Меня просто сбивало с толку, что функции этим методом тоже рассматривались как объект Chain. Вот я и не мог осознать что это flatMap
Хотя нет. Я был не прав. Это не flatMap.
chain(a => a + 1, Maybe.Just(5)) //=> 6
Если бы был flatMap, то результат в любом случае был бы обернут в Maybe

Denis
23.07.2017
00:00:14
что за хуйня?

Дмитрий
23.07.2017
00:00:29

Denis
23.07.2017
00:00:32
это рамда какая-то просто чепушная

Vadim
23.07.2017
00:01:00
А, то-есть это просто рамда некорректно пашет?
https://goo.gl/9YZ7j9

Admin
ERROR: S client not available

Дмитрий
23.07.2017
00:01:29
А это chain
Смотри, я даже не глядя угадал)

Denis
23.07.2017
00:02:52
там нечего угадывать)

Дмитрий
23.07.2017
00:03:30
Просто жс без статических типов перекладывает на тебя ответственность за то, чтобы твои данные соответствовали декларации

Vadim
23.07.2017
00:03:43
flatMap же в любом случае должен вернуть тип контейнера. Не?
Например у стримов так

Denis
23.07.2017
00:03:51
да тут и без статики должно было упасть

Дмитрий
23.07.2017
00:03:52
В частности, чтобы функция сама по себе возвращала Maybe

Google

Дмитрий
23.07.2017
00:04:08
И ты нарушил эту декларацию

Vadim
23.07.2017
00:04:23
Ясно. Значит косяк рамды

Дмитрий
23.07.2017
00:04:25
К сожалению, за это тебе ничего не было)
Я не вижу тут косяка

Vadim
23.07.2017
00:04:41
Они должны по рукам бить

Дмитрий
23.07.2017
00:04:46
Зачем*
?
Более того, я вижу проблему если бы это было сделано иначе

Vadim
23.07.2017
00:05:02
Во многих других случаях бьют

Дмитрий
23.07.2017
00:05:20
Динамическая типизация на ровном месте не нужна
И хорошо что её тут нет, ещё в chain с map не хватает валидации прототипов, да

andretshurotshka?❄️кде
23.07.2017
00:06:42
SANCTUARY

Vadim
23.07.2017
00:06:46
Они должны были использовать метод chain из контейнера например
Maybe.chain
Ха! Он так же косячит ))

Дмитрий
23.07.2017
00:08:01

andretshurotshka?❄️кде
23.07.2017
00:08:06
в чем косяк-то)

Denis
23.07.2017
00:08:17
лучше расскажите за вертикальную композицию пока не могу понять

andretshurotshka?❄️кде
23.07.2017
00:09:02
а диагональная есть?

Дмитрий
23.07.2017
00:09:36

Denis
23.07.2017
00:09:42
похоже на то что это композиция натуральных преобразований
точно!