Vladislav
> Что такое "rewrite rule в библиотеке"
в Haskell можно кастомные оптимизации прописывать. Определил ты map и добавил правило, что map f . map g = map (f . g)
Vladislav
И компилятор будет в отдельной фазе оптимизации применять эти правила
Евгений
Звучит психоделично, это же exstentional equality
Vladislav
В смысле? Вполне universal
Евгений
Опечатался
Vladislav
для любого f, g
Vladislav
Так тогда вроде не отличается от других оптимизаций, просто можно эксплойтить законы функций, которые нам известны, а компилятору — нет.
Евгений
Экстенсиональное равенство это такой факап в теории типов, который приключился с мартином лёфом при первой попытке изобрести MLTT
a66ath
http://reasonablypolymorphic.com/blog/modeling-music
Евгений
Добавление в теорию типов правила "x: a = b |= a редуцируется в b" делает теорию типов противоречивой, то есть разрушает всякую корректность
Vladislav
Vladislav
(forall x. f x = g x) => f = g это прямо определение функционального равенства
Vladislav
вопрос только в том, делать это аксиомой или доказывать на case-by-case basis
Vladislav
откуда противоречивость тут может взяться?
Vladislav
> "x: a = b |= a редуцируется в b"
вот это я вообще понять не смог
Vladislav
возьмем a = 2 и b = 1 + 1, разве можно сказать, что a редуцируется в b? Наоборот в данном случае. (Либо я неправильно правило прочитал)
Andrey
если оба терма имеют нормальную форму, редуцируются в них и они совпадают с точностью до альфа-редукции - -можно так задать
Andrey
но тогда не удастся доказать равенство [1,1..] и 1:[1,1..]
Andrey
потому что эти термы не имеют нормальных форм, хотя очевидно экстенсиалоьно равны
Cheese
Andrey
только хотел написать ай донт финк соу
Cheese
но первое редуцируется во второе же
Cheese
а второе в первое — нет
Andrey
правильно, вы предлагаете не редуцировать до конца до нормальных форм. но это более сложнаяч и творческаяч задача
Andrey
например, 1+1+2/0 = 2+2/0 так?
Andrey
можно творчески редуцировать левую и правую часть в совпадающие до альфаредукции термы, но не до нормальных форм
Andrey
прикол с нормальными формами что они единственны, и это сильно упрощает проверку
Andrey
думаю, примерно такой же смысл вкладывается в понятия интенсиального и экстенсиального равенств?
Andrey
а как вам вот такой терм 1:[1,1..] ++ [3]
Andrey
равен он [1,1..]? и если да, то в каком смысле и как это определить и доказать равенство?
Ilya
Ilya
доказать легко: докажем, что для любого наперёд заданного n -> n-ые элементы списков равны
Ilya
значит равны и сами списки
Cheese
а если не вставлять костыли специально для списков?
Cheese
можно определить так, что для любой редукции a' формулы a существует последовательность шагов редукции b в a' и наоборот
Cheese
нет, тоже не то
Cheese
сравнить нормальные формы, вычисленные до любой конечной глубины?
Cheese
WHNF-n
Ilya
может быть через него можно сделать сравнение таких списков
Ilya
главное придумать, что выбрать за Set
Ilya
хочется сделать Set = мно-во пар элементов двух этих списков, и соотв-нно натравить предикат "а есть ли хоть одна пара не вида (x, x)"
Ilya
но там есть существенные ограничения на создания такого Set, может не получиться
Mikhail
А есть статьи или книги которые всю эту теорию объясняют?
Ilya
This module is based on the paper "Exhaustible sets in higher-type computation" by Martin Escardo
Ilya
Haskell — невозможное возможно? / Хабрахабр
https://m.habrahabr.ru/post/201446/
Alexander
я в text уже натыкался на кривые rewrite rules
Anatolii
Может string не так и плох?:)
Alexander
bos иногда излишне оптимистичен
Dmitry
там хоть кто-то этот баг довел до сведения разработчиков? это всё-таки ахтунг
Alexander
что я находил - довел в тот же день
Alexander
с патчес
Alexander
и его прям в тот же день приняли
Alexander
про то, что выше, не знаю
Bohdan
multRandomNumbers rands prev = case rands of
(x:xs) -> curRand : multRandomNumbers xs curRand
where curRand = prev * ( 0.995 + ( x * 0.01 ) )Я правильно понимаю, что на x в третьей строке ругается из-за того, что подразумеваютcя матчи, в которых x нет? Что делать в таких случаях? Можно объявить локальную функцию для конкретного матча?
кана
let?
кана
multRandomNumbers rands prev =
case rands of
(x:xs) ->
let
curRand = curRand = prev * ( 0.995 + ( x * 0.01 ) )
in
curRand : multRandomNumbers xs curRand
Bohdan
[] -> [] тут по-любому возможен, явно или неявно. Хоть список и бесконечный в конкретном случае
Bohdan
Точно, забыл, что им так можно пользоваться
кана
а чего нельзя сразу rands сматчить в аргументе?
Bohdan
Вау, и так можно? ☺
кана
multRandomNumbers (x:xs) prev = curRand : multRandomNumbers xs curRand where
curRand = prev * ( 0.995 + ( x * 0.01 ) )
Vasiliy
а чо так сложно?
Vasiliy
r = 0:(zipWith nextRand randoms r) where nextRand x prev = prev * ( 0.995 + ( x * 0.01 ) )
Vasiliy
0 - начальный элемент, randoms - список случайных чисел
Bohdan
zip/zipWith я ещё не осилил, хотя часто встречаю; пойду курить, чо оно такое
Bohdan
Хмм, а почему так не компилится?
multRandomNumbers :: [Float] -> Float -> [Float]
multRandomNumbers (rand:otherRands) prev = curRand : multRandomNumbers otherRands curRand
where curRand = prev * ( 0.995 + ( rand * 0.0126315789473684 ) )
realRand = case curRand of
<0.8 -> 0.8
>1.2 -> 1.2
_ -> curRand
a66ath
Ну если не компилится то там написано почему
Bohdan
parse error on input ‘->’
Bohdan
case в where юзать нельзя, что ли?
a66ath
<0.8 в case нельзя
Bohdan
А чо можно?
a66ath
Патерн матчинг можно
Bohdan
ты язык по гуглу что ли учишь?:) возьми нормальный учебник
с let ты не знаком, с zip не знаком, зато уже код с монадами пишешь (вчера было)
Я все языки так учил: понадобилось чото — нашёл в справке, даже до интернетов ещё. Не вижу смысла муштровать кучу теории, хоть это и полезно (в теоркат въезжаю потихоньку). Тем более, zip, как вижу — сахарок какой-то, раз получилось без него, просто велосипедно
А без монад реальной жизни нет, только в ghci что-то считать, смысл их откладывать? ☺
Ilya
вот глянь https://anton-k.github.io/ru-haskell-book/book/4.html
Ilya
насчёт let и пр.