
Denis
27.09.2017
13:51:40
Вернее foldrOf

kana
27.09.2017
13:52:52
я кату делаю твою, тут нет никаких фолдофов

Leonid
27.09.2017
13:54:26
кату?

kana
27.09.2017
13:54:50
https://www.codewars.com/kata/lensmaker/train/haskell

Google

kana
27.09.2017
13:56:06
вот тут меня еще гложат сомнения
elements :: T.Traversable f => Traversal (f a) (f b) a b
elements = traverse
в сорцах либы там тоже фолдоф (или елементсОф), но зачем - хз
Как часто вы используете coerce? Выглядит полезным при оптимизации, но нужно серьезно жертвовать читаемостью и понимаемостью кода имхо

Vasiliy
27.09.2017
14:20:40

kana
27.09.2017
14:26:01
Ну у меня он почти и не отличается кроме двух моментов:
- добавляется запаковка в Endo (а для этого значение еще и превращается в эндоморфизм (2 -> (2:)), а на выходе еще и разворачивается из End

Oleg
27.09.2017
14:26:07

Denis
27.09.2017
14:26:39

kana
27.09.2017
14:28:08
Каким образом? head? А если пустой массив вернется? Ошибка в рантайме же будет

Denis
27.09.2017
14:28:28
Это ты кому?

kana
27.09.2017
14:28:34
тебе

Vasiliy
27.09.2017
14:28:47

Denis
27.09.2017
14:29:22
Пардон)
view l = foldMapOf l id
А фолдроф через фолдмапоф

Google

Denis
27.09.2017
14:30:39
А листоф через фолдроф

Vasiliy
27.09.2017
14:32:26

Alexander
27.09.2017
14:40:54

Denis
27.09.2017
14:45:43

Vasiliy
27.09.2017
14:50:34
вот здесь
Чет у меня получился какой-то сложный toListOf
toListOf :: Optic (->) (K (Endo [a])) s s a a -> (s -> [a])
toListOf lens = flip appEndo [] . getK . lens (K . Endo . (<>) . (:[]))
K (Endo [a])

Denis
27.09.2017
14:52:56
hs
toListOf :: Optic (->) (K (Endo [a])) s s a a -> (s -> [a])
toListOf l = foldrOf l (:) []

kana
27.09.2017
14:53:12
такая сигнатура по условию, но в либе она такая же
type Getting r s a = (a -> Const r a) -> s -> Const r s
toListOf :: Getting (Endo [a]) s a -> s -> [a]

Vasiliy
27.09.2017
14:54:03
гм... ну ладно

Aleksey
27.09.2017
14:54:46
одноразовая если только
Чем многоразовая хуже? Вроде работает:
λ> take 10 $ [1..] ++ [1..] ++ [1..]
[1,2,3,4,5,6,7,8,9,10]
λ> take 10 $ [1..] ++ ([1..] ++ [1..])
[1,2,3,4,5,6,7,8,9,10]
λ> take 10 $ ([1..] ++ [1..]) ++ [1..]
[1,2,3,4,5,6,7,8,9,10]
Да, будет проталкивание через слои функций, но всё же
Немного длинных списков конкатить можно вполне, вот много коротких - уже ниочень

Alexander
27.09.2017
14:55:51
ну называть быстрой операцию, которая делает проход по списку квадратичным это странно

Aleksey
27.09.2017
14:57:46
Всё равно будет сравнительно неплохо, если сравнить с энергичными языками, где односвязные списки конкатить всегда дорого :)
Каждый следующий конкат будет проталкивать значения по одному. Да, каждый слой пройдёт по своему первому слагаемому (лениво), прежде чем вернёт второе. Но на этом накладные расходы вроде бы и заканчиваются

kana
27.09.2017
15:01:30
-- | A helper function which witnesses the fact that any
-- container which is both a Functor and a Contravariant
-- must actually be empty.
coerce :: (Contravariant f, Functor f) => f a -> f b
coerce = error "todo"
Как это реализовать можно в принципе?
fmap (const undefined) разве что, или даже просто fmap undefined

Denis
27.09.2017
15:04:32

Google

kana
27.09.2017
15:04:40
если не упадет, значит контейнер пустой

Denis
27.09.2017
15:05:04
а вообще я такое сделал contramap (const ()) . void
но насколько я помню это phantom https://www.stackage.org/haddock/lts-9.6/contravariant-1.4/src/Data.Functor.Contravariant.html#phantom

Alexander
27.09.2017
15:09:59
это lensmaker?

kana
27.09.2017
15:10:14
yep

Alexander
27.09.2017
15:11:27
хм.. инетерсно у меня не реализовано

Denis
27.09.2017
15:11:42
я кидал там список сверху

Alexander
27.09.2017
15:13:44
ну зачем решение сразу кидать
кто ж так делает :/

Denis
27.09.2017
15:14:02
я не про решение)
я про список


kana
27.09.2017
15:25:34
не ну вполне работает
coerce :: (Contravariant f, Functor f) => f a -> f b
coerce = fmap undefined
-- | A Fold which views the result of a function application
to :: (a -> b) -> Fold a b
to f = \pure' -> coerce . pure' . f
как правильно называть первый аргументы оптик (a -> f b)? next? До того, как я понял, как они композируются, называл pure', потому что она как бы поднимала значение, но это не совсем верно
Оооо, только что получил бесценный опыт. Был такой код:
_flip :: Iso (a, b) (a, b) (b, a) (b, a)
_flip pure' (a, b) = fmap swap (pure' (b, a))
Все вроде нормально, но не тайпчекается, потому что в Iso указано, что pure' - не функция ((b, a) -> f (b, a)), а профунктор p (b, a) (f (b, a)), а профункторы конечно применять нельзя. Минут 10 ломал голову, что мне делать. Решение простое, конечно, нужно просто писать в point-free, при это использовать не композицию, а ее обобщение на профункторах, а именно lmap/rmap/dimap. Собственно, как я понял, point-free - единственный способ работать с профункторами
_flip :: Iso (a, b) (a, b) (b, a) (b, a)
_flip = dimap swap (fmap swap)
Вроде все поверхность обошел, линзы, траверсалы, фолды, изо, осталосись только призмы. А там какие-то козвезды и я не понимаю типы вообще. А все, что до этого было, можно было придумать и реализовать исключительно по типам


Denis
27.09.2017
16:20:53

Alex
27.09.2017
16:21:10
звезда/козвезда это тривиальные профункторы

kana
27.09.2017
16:21:14
ну вот ее я сделать и не могу, все остальные тесты проходят

Alex
27.09.2017
16:21:39
у которых один из мапов - id

Google

kana
27.09.2017
16:22:01
p (Either a c) (Either b c) ?
Так, это choice

Yuriy
27.09.2017
16:22:12

kana
27.09.2017
22:58:38
Я правильно понимаю, что при генерации призм lens не делает линзы для полей конструкторов?

Artyom
27.09.2017
22:58:55
да

kana
27.09.2017
22:59:01

Artyom
27.09.2017
22:59:48
_Cat._1 замени просто на name

kana
27.09.2017
23:00:11
вау
спасибо

Artyom
27.09.2017
23:00:19
кстати, можно было второму _name штрих не добавлять
а, хотя тогда собаки тоже попадут
а тебе это не надо, наверно

kana
27.09.2017
23:01:10
куча магии появляется)

Artyom
27.09.2017
23:01:12
хотя-хотя я бы все равно штрих не добавлял, а вместо этого сделал traverse . filtered (is _Cat) . name
так даже вроде и понятнее
наверно, можно как-то без filtered сделать, но сходу не придумал

Evgeny
28.09.2017
06:33:44
Народ, а как феншуйно парсить JSON, в котором могут быть, а могут не бывать пары ключ-значение с заранее неизвестными именами ключей?
Использовать в коде тип словаря?

Dmitry
28.09.2017
06:34:07
ну логично же?

Evgeny
28.09.2017
06:34:57
Логично, но вопрос про феншуй:-) вдруг чего-то не знаю

Alexander
28.09.2017
06:47:04
в Value и хранить

Google

Alexander
28.09.2017
06:47:28
самый общий метод
там можно весь json хранить в котором неизвестно что
если есть какая-то информация о структуре и типах то уже использовать более точные типы

Aleksey
28.09.2017
06:53:23
Value подойдёт, если типы значений тоде неизвестны. А если известны, то лучше сразу в HashMap декодить

Alexander
28.09.2017
07:03:40
"а если есть какая-то информация о структуре и типах то уже использовать более точные типы"

Evgeny
28.09.2017
07:12:36
Ок, понял, спасибо.
У меня кусок данных, видимо, в словарь пойдет

Aleksey
28.09.2017
07:52:28

Denis
28.09.2017
08:20:29

Aleksey
28.09.2017
08:20:57
типа того, да

Denis
28.09.2017
08:21:17

Aleksey
28.09.2017
08:21:20
призма - сама себе фильтр, когда в траверсе находится

Denis
28.09.2017
08:21:34
призма - сама себе фильтр, когда в траверсе находится
• Couldn't match type ‘Pet’ with ‘(String, Int)’
Expected type: (String -> Const (Endo [String]) String)
-> (String, Int) -> Const (Endo [String]) (String, Int)
Actual type: (String -> Const (Endo [String]) String)
-> Pet -> Const (Endo [String]) Pet
• In the second argument of ‘(.)’, namely ‘name’
In the second argument of ‘(.)’, namely ‘_Cat . name’
In the second argument of ‘(.)’, namely ‘traverse . _Cat . name’

Aleksey
28.09.2017
08:22:58
кусок ошибки без кода и не на минимальном примере не способствует желанию ошибку читать :)
> [Left (1,"foo"), Right (), Left (2, "bar")] ^.. traverse . _Left . _2
["foo","bar"]

Vasiliy
28.09.2017
08:26:21
дело в том, что makePrisms делает _Cat призмой из Pet в (String, Int)

Denis
28.09.2017
08:30:29

Aleksey
28.09.2017
08:31:33
Хмм, да, _Left это не призма, а изо

Denis
28.09.2017
08:35:02
а для этого изо сделать можно?)

Aleksey
28.09.2017
08:36:38
λ> data Pet = Dog { _age::Int,_name::String} | Cat{_age::Int,_name::String} deriving (Show); $(makePrisms ''Pet); $(makeLenses ''Pet)
λ> [Cat 3 "Tom", Dog 5 "Sparky"] ^.. traverse . _Dog . re _Dog . name
["Sparky"]
тут без filtered, но приходится обратно восстанавливать рекорды, чтобы линзы по имени применить

Alexander
28.09.2017
08:37:08
кто виндой пользуется