@haskellru

Страница 394 из 1551
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
Я же правильно понимаю, что а хаскеле тру зависимых типов никогда не будет из-за боттома, а если и будут, то доказывать ничего будет нельзя? Да и на core это как-то не кладется, сплошные хаки типа symbolVal будут
Неправда. Дополнить язык с рекурсивными типами зависимыми несложно. Достаточно выделить зависимые типы в отдельным "универсум", построить проекцию из него в основной универсум, и припилить сахар, чтобы не было видно, что это два разных универсума

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
но тогда не удастся доказать равенство [1,1..] и 1:[1,1..]
эти два выражения синтаксически совпадают (после рассахаривания)

Страница 394 из 1551