
kana
07.02.2018
17:09:30
вот Rec' f и Rec'' f = forall r. Rec f r возможно можно свести, но не факт
да, PatternSynonyms интересный, но чет странно пахнет

Denis
07.02.2018
17:32:21
я заметил одно, часто подход с CPS убирает квадратичную сложность
все потому что Church рулит)

Google

Anatolii
07.02.2018
17:37:46

Denis
07.02.2018
17:39:05
это не тот черч энкодинг что на слуху

Anatolii
07.02.2018
17:39:26
а можно поробнее?
Гонзалез где-то писал что черч энкодинг прямо обязательно понять. Но где почтитаь не сказал
какую-то ссылочку может киньте
или название пейпера может

Denis
07.02.2018
17:40:44
http://programmable.computer/posts/church_encoding.html я подозреваю что гонзалез про лямбда-термы мог писать черч-энкоднутые

kana
07.02.2018
17:40:57
в моем представлении черч-энкодинг это adt на лямбдах (а для работы со значенем свертки), а мне тут на функторах что-то кидали

Denis
07.02.2018
17:41:11
так ведь все можно заэнкодить в черче

kana
07.02.2018
17:41:15
о, да, то что выше
типа
-- adt
data Tree a = Leaf a | Node (Tree a) a (Tree a)
-- church
type Tree a =
forall c. (a -> c) -> (c -> a -> c -> c) -> c
leaf :: a -> Tree a
leaf := \x foldLeaf foldNode ->
foldLeaf x
node :: Tree a -> a -> Tree a -> Tree a
node := \l x r foldLeaf foldNode ->
foldNode
(l foldLeaf foldNode)
x
(r foldLeaf foldNode)
foldTree :: (a -> c)
-> (c -> a -> c -> c)
-> Tree a
-> c
foldTree foldLeaf foldNode x = x foldLeaf foldNode

Denis
07.02.2018
17:44:15

kana
07.02.2018
17:44:39
все, что я выше написал, я и считал черч-энкодингом

Google

Anatolii
07.02.2018
17:45:03

Denis
07.02.2018
17:45:21
newtype TreeC a = TreeC { runTree :: forall r. r -> (r -> a -> r -> r) -> r } deriving Functor
вот дерево в черче

kana
07.02.2018
17:48:31
если сделать Leaf со значнием, то получится то же, что и у меня

Denis
07.02.2018
17:50:30

kana
07.02.2018
17:53:22
кстати, отсюда у меня давно уже вывод идет, что
a) у foldов всегда редьюсер должен быть a -> b -> b, как у foldr
b) начальное значение должно идти перед редьюсером, так как [] объявлен ранее :

Alexander
07.02.2018
17:58:51
растоканал откуда начинать читать ? СС @catamorphism

Denis
07.02.2018
17:59:46
@qnikst да там одна фраза была по большому счету

Alexander
07.02.2018
18:00:16
ну тогда не найти уже

Denis
07.02.2018
18:06:06

Denis
07.02.2018
18:11:08
хорошо что так хайлайты не работают

Alexander
07.02.2018
18:23:54
сильно повезло

Kirill
07.02.2018
18:25:36
Подскажите, чем из xml-я (строка) по xpath-у/набору фильтров вытащить значение ноды?

Denis
07.02.2018
18:28:49
hxt самое xpath-оподобное было. Мы dom-parser/xml-conduit юзаем.

Yuriy
07.02.2018
18:29:54
у меня xml-lens в петпроекте

Kirill
07.02.2018
18:30:29
можно примерчики?)

Yuriy
07.02.2018
18:31:32
notifaika/RSS.hs at master · cblp/notifaika
https://github.com/cblp/notifaika/blob/master/src/Notifaika/RSS.hs

Kirill
07.02.2018
18:31:51
спасибо)

Yuriy
07.02.2018
18:35:35
правда, линзы — это мягко говоря, не для новичков

Google

Yuriy
07.02.2018
18:35:53
особенно всякие plate в этом xml-lens

Denis
07.02.2018
18:38:53
я вот и думаю чего ты человека на три линзы послал

Yuriy
07.02.2018
18:45:31
я не сразу увидел, что человек из новичков пришёл


Kirill
07.02.2018
19:05:02
Да линзы я худо бедно осилил
data ApplicationData = ApplicationData { _fieldA :: a, _fieldB :: b }
data UserData = UserData { _uFieldA :: Maybe a, _uFieldB :: Maybe b }
есть подобного рода рекорды: рекорд приложения, где множество филдов разных типов и рекорд пользователя, где каждый тип обёрнут в Maybe. Как "применить" один рекорд на другой, без обилия копипасты или template haskell (его ещё не осилил)? Т.е. для всех не Nothing значений рекорда пользователя записать значение в рекорд приложения?
пытался вот так, но, очевидно, ничего не вышло (не подумал):
mergeConfiguration original user = foldl transfer original $ filter userSetValue originalOnUser
where transfer original' (originalPath, userPath) = over originalPath (const $ fromJust $ preview userPath user) original'
userSetValue (_, userPath) = isJust $ preview userPath user
originalOnUser =
[ fieldA
, fieldB
] `zip`
[ uFieldA
, uFieldB
]


Vasiliy
08.02.2018
00:45:09
изучаю хаскель, решил немного поразбираться с cloud haskell и реализовать bully algoritm (https://en.wikipedia.org/wiki/Bully_algorithm)
у меня самая первая задача – при старте нового узла обнаружить все остальные узлы
я так понял, что мне нужен distribributed-process-simplelocalnet? –
Simple backend based on the TCP transport which offers node discovery based on UDP multicast
т.е. если я правильно все понял:
я запускаю 2 ноды и вызов findPeers на второй ноде должен что-то вернуть, но ничего не происходит
main ∷ IO ()
main = do
[host, port] ← getArgs
backend ← initializeBackend host port initRemoteTable
node ← newLocalNode backend
peers ← findPeers backend 1000000
runProcess node $ forM_ peers $ say . show
forever $ return ()
ладно, начну-ка я сначала с их примера с master/slave, завтра

Alexander
08.02.2018
01:04:02
IOHK task detected
d-h-simplelocalnet / d-p-p2p
проверь что не на ipv6 интерфейс, если патч пришлешь то спасибо
и.к. network-transport-tcp его не умеют

Vasiliy
08.02.2018
01:09:16
спасибо!

Alexander
08.02.2018
01:09:46
лучше сразу понять как работает simplelocalnet и забить на мастер слейв
я не помню условий но simplelocalnet работает в локальной сети только, или мультикаст сети
и.к. поиск нод на основе мульткаста
но адрес вроде фиксирован
+ роутеры и провайдеры могут резать мультикаст
если там требуется не только локальная сеть, то надо -p2p
но надо знать адрес одной ноды хотя бы чтобы инициализировать сеть

Google

Alexander
08.02.2018
01:12:54
автор либы где-то вокруг есть я там апи не помню

Vasiliy
08.02.2018
01:13:37

Alexander
08.02.2018
01:14:02
у тебя ноды в разных сетях?

Vasiliy
08.02.2018
01:14:22
про это не сказано в условиях задачи, думаю, можно придраться)
https://bitbucket.org/dpwiz/distributed-process-p2p/
вот эта

Alexander
08.02.2018
01:14:43
на хакадже смотри

Vasiliy
08.02.2018
01:15:01
ну да, это оно https://hackage.haskell.org/package/distributed-process-p2p, завтра попробую, спасибо

Alexander
08.02.2018
01:15:35
ага
интересно, мне казалось ее NCrashed а не dpwiz писал
мне стыдно

Aleksey
08.02.2018
06:49:43
Чёт сколько я не гуглил, не нашел Haskell-based аналогов скедулера общего назначения с пуллом воркеров, очередями с приоритетами, т.е. чтобы всё "как у больших"...
У питона вон есть Celery. И куча примочек для неё типа админки с графиками и т.д.

Kirill
08.02.2018
07:06:58
индусы из vacation labs что-то обещались заопенсорсить
я так понимаю сделанное по мотивам рубишного чего-то, т.к. с рубёв они мигрировали
из необщего есть варианты типа https://hackage.haskell.org/package/postgresql-simple-queue

Denis
08.02.2018
07:21:25
начинается http://reasonmlhub.com/exploring-reasonml/

Aleksey
08.02.2018
07:41:44
А на хаскеле полторы либы для запуска IO в стиле Cron

Denis
08.02.2018
07:42:29
у нас своя поделка есть
но она не гнется, поэтому никто никогда её не заопенсорсит

Google

Aleksey
08.02.2018
07:42:54
наша поделка - убогая

Denis
08.02.2018
07:43:13
да кто ж спорит

Aleksey
08.02.2018
07:43:50
Надо написать. Будет киллер-приложение!

Denis
08.02.2018
07:44:07
почти как у рубистов!

Kirill
08.02.2018
07:44:11
data ApplicationData = ApplicationData { _fieldA :: a, _fieldB :: b }
data UserData = UserData { _uFieldA :: Maybe a, _uFieldB :: Maybe b }
есть подобного рода рекорды: рекорд приложения, где множество филдов разных типов и рекорд пользователя, где каждый тип обёрнут в Maybe. Как "применить" один рекорд на другой, без обилия копипасты или template haskell (его ещё не осилил)? Т.е. для всех не Nothing значений рекорда пользователя записать значение в рекорд приложения?
пытался вот так, но, очевидно, ничего не вышло (не подумал):
mergeConfiguration original user = foldl transfer original $ filter userSetValue originalOnUser
where transfer original' (originalPath, userPath) = over originalPath (const $ fromJust $ preview userPath user) original'
userSetValue (_, userPath) = isJust $ preview userPath user
originalOnUser =
[ fieldA
, fieldB
] `zip`
[ uFieldA
, uFieldB
]
Видимо никак?

Denis
08.02.2018
07:44:47

Kirill
08.02.2018
07:45:20
Да хотелось фичами языка обойтись

Denis
08.02.2018
07:45:39
тут генериковые решения явно оверкилл
а вообще это похоже на один и тот же тип параметризованный функтором data Data f = Data { a :: f a, b :: f b, … }
но для раздербанивания опять же либо генерики, либо ручками все поля пройти(в редакторе макросами вхуж и готово)

Kirill
08.02.2018
07:47:47
Да, но суть то именно в том что б эту структурку потраверсить
Ладно, спасибо, буду копипастить

Denis
08.02.2018
07:48:27
чтобы её траверсить, этот рекорд должен быть гетерогенным, HList или похожие
рекомендую копипастить

Kirill
08.02.2018
07:49:13
HList foldable?
(делать для этого так я не буду, просто в рамках общего развития)

Denis
08.02.2018
07:49:49
нет, он не может быть Foldable, там в разных полях значения разных типов
Foldable так не работает
для него значения одного типа должны быть

Kirill
08.02.2018
07:50:27
Ну может там маркер типа для каждой итерации передаётся

Denis
08.02.2018
07:51:03
какой тип по твоему должен быть у этой операции?