
kana
01.10.2017
23:58:31
ST - не функциональная вещь

Дмитрий
01.10.2017
23:58:40
Ну дык)
Ни разу кстати не возникло ситуации когда потребовалось бы что то типа такого after
Явное лучше неявного

Google

kana
01.10.2017
23:59:16
+
я короч не осилил этот printf
на идрисе такое делается как нефиг, тут чет сложно

Дмитрий
02.10.2017
00:01:01
А на идрисе каким путём реализуется?

kana
02.10.2017
00:01:09
нужно писать его самому, тогда вкурю, принцип простой
ну в идрисе мы в типе можем взять строку и сгенерить по ней тип

Дмитрий
02.10.2017
00:01:58
Аа, ништяк)

kana
02.10.2017
00:02:32
f : [Char] -> Type
f [] = String
f '%'::'d'::xs = Int -> f xs
f '%'::'s'::xs = String -> f xs
f _::xs = f xs

Дмитрий
02.10.2017
00:04:14
Мощно ?

kana
02.10.2017
00:26:35
ебана, познакомился с тардисом

Дмитрий
02.10.2017
00:26:47
??
Чо как оно?)

kana
02.10.2017
00:28:05
это сложно понять очень, мозги текут

Google

Дмитрий
02.10.2017
00:30:04
Достаточно понять ээто в будущем
И отправить разъяснение себе в прошлое

kana
02.10.2017
00:30:19
лол

Kelin
02.10.2017
00:41:51
ля
так ору чета
написал нечитаемую хуету, но выглядит прикольно
https://twitter.com/kelin2025/status/914643587920429056
прогнать это препаком и тупа каеф

Дмитрий
02.10.2017
00:43:24
Препак тут особо никак не поможет

Kelin
02.10.2017
00:43:36
почему
верхнюю часть соберет
думаю
не ну прикольно жи
point free in a nutshell

Дмитрий
02.10.2017
00:45:32
Аккуратнее, так можно fp fatigue заработать)

Kelin
02.10.2017
00:45:41
та не
ну здесь то норм все вроде)
читать просто снизу вверх надо

kana
02.10.2017
01:01:44
так
я написал ту херню из статьи про Тардис на жс

Google

kana
02.10.2017
01:02:29
типа получить массив и вернуть массив из m, где m - максимальный элемент массива, за один проход
то есть типа взял значение из будущего
arr_ - это типа вычисленное значение уже, не thunk
лучше конечно не делать так, а сделать какой враппер, который сам будет кэшировать результат

Kelin
02.10.2017
01:17:24
А зачем для new Nil еще и функция nil?

kana
02.10.2017
01:18:02
1. создавать вещи через new очень не удобно
2. nil отдает ленивое значение

Kelin
02.10.2017
01:18:49
Окей, спасибо

Дмитрий
02.10.2017
01:19:30
Омг, круто)) Выложи gist
Я в то же время начал на purescript пробовать, но там напрямую не портируется, я ещё не оч понимаю почему

kana
02.10.2017
01:21:41
https://gist.github.com/kana-sama/9224b4c8d7c4841e77a114e12c97c1d4
думаю, тут есть проблемы с тем, что распаковка производится чаще, чем нужно, работаю над эти
вроде вот - https://gist.github.com/kana-sama/e0dddbb9de77a3b1acd463cb9f747cd0
чуть исправил, заменил lazy на класс, чтобы лишнюю функцию не генерить
Единственное, что тут не сходится с хаскельной версией:
const result = repMax(
arr,
lazy(() => result.exec().first.exec()) // <- this
);
Потому что в js по очевидным причинам нельзя при инициализации переменной использовать себя)
Если бы вдруг можно было бы, то выглядело бы это так:
const result = repMax(arr, result.exec().first);
если поставить в max console.log, то можно увидеть, что он там вызывается ровно два раза (2, 3) и (3, 1)
Пост вот - http://kcsongor.github.io/time-travel-in-haskell-for-dummies/

Дмитрий
02.10.2017
01:47:44

kana
02.10.2017
01:49:08
я короче еще не до конца осознал, как мой код работает, попробую заватра
это какая-то ленивая магия
ну, вроде вся суть в том, что каждый элемент нового массива не расчитается до тех пор, пока мы все максы не посчитаем

Google

kana
02.10.2017
01:50:32
точнее, пока мы не посчитаем один макс, а его расчет требует расчета остальных максов
изи короче
то есть по факту задача реально решается за один проход - это проход максов, потом каждый элемент массива уже сетается по вычисленному максу

andretshurotshka?❄️кде
02.10.2017
02:03:48
?

Дмитрий
02.10.2017
02:04:24
Это не принципиально

andretshurotshka?❄️кде
02.10.2017
02:04:33
Как?)

kana
02.10.2017
02:04:59
Ну в данной задаче принципиально
Это решаемо на жс, потому что есть стейт, где я кеш положил

Дмитрий
02.10.2017
02:05:40
В хаскеле имплементация через fix point. В пурсе абсолютно так же есть fix, но я не уверен в тождественности этих структур и поэтому не могу быть увереным, что результат будет аналогичным

andretshurotshka?❄️кде
02.10.2017
02:22:41
https://gist.github.com/paf31/5c1279796d66fe04a177e34b0d674ac6

Дмитрий
02.10.2017
02:41:43

kana
02.10.2017
02:44:26
Не так все верно
Тип списка не зафикшен
Конс там по сути пара, как в лиспах

Дмитрий
02.10.2017
02:45:22
Ага
Я сначала типизировал всё, а потом начал смотреть, что мне предлагается на выводе)
Флоу наводит меня на мысль, что в этой задаче все структуры ленивы по умолчанию
То есть нет lazy(() => Cons(....)), есть просто ленивый Cons
В котором значение можно вычислять при первом обращении к нему
И тут я начинаю понимать, к чему это всё приводит)) ??

Google

kana
02.10.2017
02:49:33
Делать там конс ленивым не было смысла, но я сделал, чтобы все функции работали одинобразно, то есть всегда получали лень, если я правильно тебя понял

Дмитрий
02.10.2017
02:50:16
Ага
В общем, тардис — ето mobx, внезапно
А точнее, что-то сильно напоминающее его механизм установления зависимостей между computed полями
Значение "из будущего" означает, что мы уже имеем переменную, но её реальное значение ещё не посчитано
Всё переплетено ?

Denis
02.10.2017
02:59:59
монада тардис?

Дмитрий
02.10.2017
03:00:03
Да
Которая отправляет значения в будущее и в прошлое

Denis
02.10.2017
03:01:05
хрономорфизм)

Дмитрий
02.10.2017
03:01:48
Главное чтобы не дихрономорфизм

Denis
02.10.2017
03:02:30

kana
02.10.2017
03:04:28
Лол)

Denis
02.10.2017
03:17:55
chronomorphisms can 'look back' when consuming a type and 'jump forward' when generating one, via it's fold/unfold operations, respectively.

andretshurotshka?❄️кде
02.10.2017
04:36:13
Хм

Павел
02.10.2017
10:25:48

Alex
02.10.2017
10:28:26
а это purescript?

Павел
02.10.2017
10:28:39
Хм, я ни разу не писал на хаскеле, но знаю что такое футуры и корутины)

illiatshurotshka❄️
02.10.2017
10:28:55
что за шрифт?

Павел
02.10.2017
10:29:08
Без понятия, взято отсюда: http://lambdasoft.ru/posts/2016-03-05--tardis.html