
Anatolii
07.09.2017
18:25:47
Но это конечно не нормально

? animufag ?
07.09.2017
18:33:25
ого, сглаживание

Index
07.09.2017
18:33:35
not my screenshot

Ilya
07.09.2017
18:39:27
а разбор будет?

Google

Ilya
07.09.2017
18:39:30
почему так

Index
07.09.2017
18:39:41
Неправильный rewrite rule в text

Denis
07.09.2017
18:50:22
http://www.parsonsmatt.org/overcoming-records/

Bohdan
07.09.2017
18:58:43
Почему в стейте постоянно начальное значение? Я что-то делаю не так?
currentSpeed :: Float -> String
currentSpeed i = "set speed " ++ ( show $ evalState ( modSpeed i ) initSpeed )
modSpeed :: Float -> State Float Float
modSpeed i = do
old <- get
let new = ( old - 1)
put new
return new
initSpeed = 1

Index
07.09.2017
18:59:10
Почему оно должно меняться?

Bohdan
07.09.2017
18:59:27
Ну я же путаю новое, или?

Index
07.09.2017
18:59:47
Ну путаешь, а потом ничего с ним не делаешь

Bohdan
07.09.2017
19:00:51
А что с ним делать нужно? Этот стейт каждый раз пересоздаётся, получается?

Index
07.09.2017
19:01:19
Разумеется
А как еще?
Это же чистая функция
Он не то что пересоздается, тут вообще переменных нет никаких

Vasiliy
07.09.2017
19:02:07
погодите, что значит начальное значение?

Google

Bohdan
07.09.2017
19:02:14
Как тогда запоминать? Синглтон нужен?

Vasiliy
07.09.2017
19:02:20
на выходе evalState должен быть 0

Index
07.09.2017
19:02:23
Какой синглтон?

Vasiliy
07.09.2017
19:02:33
синглтон? :D
глобальная переменная штоле?

Index
07.09.2017
19:02:46
ну да, а я так понимаю автор ожидает, что много раз если вызвать, то будет 0, -1, -2, etc

Vasiliy
07.09.2017
19:03:25
да, видимо, так и есть

Index
07.09.2017
19:03:40
Если уж очень-очень хочется, то делается это через IORef
но лучше просто не делать так и не хотеть так
в конце концов в этом смысл чисто функционального программирования, что все компоненты ведут себя предсказуемо и состояния глобального не имеют
Вот если currentSpeed :: Float -> String, то это значит, что ты передаешь число, а получаешь строку на выход
и сколько ты эту функцию не вызывай, при каких обстоятельствах не вызывай, будет она возвращать одно и то же значение
потому что это *функция*
а не процедура

Bohdan
07.09.2017
19:08:43
Ну суть такова: я пилю генератор плавно колеблющихся вокруг стартового значения чисел. stdgen выдаёт множитель, который меняет предыдущее выведенное значение. То есть без знания предыдущего числа тут ничё не выйдет

Index
07.09.2017
19:10:14
Ну так если тебе нужно работать со случайными числами, то ты уже не можешь писать чистые функции без монадического контекста. Тебе нужно использовать Rand
https://hackage.haskell.org/package/MonadRandom-0.5.1/docs/Control-Monad-Random-Strict.html

Ilya
07.09.2017
19:12:20
так случайные числа можно же на стейте как раз написать?

Vasiliy
07.09.2017
19:12:25
дык, если нужно просто знать предыдущее число, почему бы не передавать его аргументом?

Ilya
07.09.2017
19:12:27
я даж писал ?

Google

Ilya
07.09.2017
19:12:33
как упражнение

Index
07.09.2017
19:13:15
просто хелперов побольше для рандомной генерации

kana
08.09.2017
00:16:23
Я же правильно понимаю, что а хаскеле тру зависимых типов никогда не будет из-за боттома, а если и будут, то доказывать ничего будет нельзя? Да и на core это как-то не кладется, сплошные хаки типа symbolVal будут
Агда давно не обновлялась чет, идрис не продакшен реди (да че продакшен, тайпчек фильтра по вектору выжирает 10 гигов и виснет), хоть нравится мне он больше всех. Есть ли какие-то популярные хаскель-подобные языки с завтипами?
Хочу в эту тему углубиться, но вижу только coq и изабеле. Lean еще понравился

Arseniy
08.09.2017
00:23:29
Слышал, что jetbrains что-то делали

Index
08.09.2017
00:23:40
> давно не обновлялась
Месье требовательный
Касательно зависимых типов в Haskell, доказывать будет можно, но пруфы нужно будет запускать в рантайме (чтобы исключить боттом).
Если пруф-тёрм высчитается и не будет bottom, то все доказано нормально. Это, конечно, удар по производительности, но не deal-breaker.
Но в качестве proof assistant он не сгодится все равно, конечно.
Точнее, будет неудобно, как ни крути.
Agda и Coq нормальные, если именно для доказательств.
А именно для программирования готовых хороших решений нет. Недавно видел, что John Wiegley генерирует Haskell на Coq. В итоге все доказательства на Coq, а компиляет это GHC, и работает оно хорошо.
Можно этот путь попробовать, потому что ему вроде нравится.

Alex
08.09.2017
00:46:55
в Изабелле нет завтипов

kana
08.09.2017
01:04:59
А, хм, на сайте у них просто последний релиз то ли 2014, то ли 2016)

? animufag ?
08.09.2017
01:26:09
F*
(раз в неделю этот вброс)

Google

Евгений
08.09.2017
07:36:31

Abbath
08.09.2017
07:42:34
Semigroup уже суперкласс Monoid в HEAD

Ruslan
08.09.2017
07:47:08
123456
ну, вы все поняли?

Kit
08.09.2017
12:30:53
а что не так?

Index
08.09.2017
12:31:20
Флаг оптимизации меняет вывод программы с True на False

Kit
08.09.2017
12:31:58
оуч...!!

Евгений
08.09.2017
12:32:45
Хотя по normalization theorem есть есть нормализация, то она единственна
Но тут побочные эффекты!

Index
08.09.2017
12:33:39
Порядок редукции не должен ничего менять там, это был неправильный rewrite rule в библиотеке.
Какие побочные эффекты, в length и filter?

Евгений
08.09.2017
12:34:06
В print

Index
08.09.2017
12:34:35
И что?
Теперь print должен менять то, что ему сказали распечатать, в зависимости от порядка редукции?

Anatolii
08.09.2017
12:35:13
А можно подробнее объяснить как рулы так повлияли на результат?

Евгений
08.09.2017
12:35:15

Index
08.09.2017
12:35:20
Типа, "а ладно, применю not, все равно побочные эффекты"
> Что такое "rewrite rule в библиотеке"
в Haskell можно кастомные оптимизации прописывать. Определил ты map и добавил правило, что map f . map g = map (f . g)
И компилятор будет в отдельной фазе оптимизации применять эти правила

Google

Index
08.09.2017
12:36:45

Евгений
08.09.2017
12:37:00
Звучит психоделично, это же exstentional equality

Index
08.09.2017
12:37:23
В смысле? Вполне universal

Евгений
08.09.2017
12:37:37
Опечатался

Index
08.09.2017
12:37:40
для любого f, g
Так тогда вроде не отличается от других оптимизаций, просто можно эксплойтить законы функций, которые нам известны, а компилятору — нет.

Евгений
08.09.2017
12:39:13
Экстенсиональное равенство это такой факап в теории типов, который приключился с мартином лёфом при первой попытке изобрести MLTT

Abbath
08.09.2017
12:40:10
http://reasonablypolymorphic.com/blog/modeling-music

Евгений
08.09.2017
12:41:24
Добавление в теорию типов правила "x: a = b |= a редуцируется в b" делает теорию типов противоречивой, то есть разрушает всякую корректность

Index
08.09.2017
12:47:18
(forall x. f x = g x) => f = g это прямо определение функционального равенства
вопрос только в том, делать это аксиомой или доказывать на case-by-case basis
откуда противоречивость тут может взяться?
> "x: a = b |= a редуцируется в b"
вот это я вообще понять не смог
возьмем a = 2 и b = 1 + 1, разве можно сказать, что a редуцируется в b? Наоборот в данном случае. (Либо я неправильно правило прочитал)

Андрей
08.09.2017
12:59:20
если оба терма имеют нормальную форму, редуцируются в них и они совпадают с точностью до альфа-редукции - -можно так задать
но тогда не удастся доказать равенство [1,1..] и 1:[1,1..]
потому что эти термы не имеют нормальных форм, хотя очевидно экстенсиалоьно равны

Yuriy
08.09.2017
13:01:27