Aleksei (astynax)
А можно сделать randInt <$> getStdGen и сразу получить IO Int
Aleksei (astynax)
Только что-то randInt странно выглядит - он ведь не число возвращает, а список чисел, судя по mapM_. Если это так, то название функции - плохое
Vladislav
Vladislav
ко-ко-корректность, ха-ха-хаскель
Anatolii
Сейчас расползется по интернетам
Anatolii
Но это конечно не нормально
Влод
Vladislav
not my screenshot
Ilya
Ilya
почему так
Vladislav
Неправильный rewrite rule в text
Зигохистоморфный
http://www.parsonsmatt.org/overcoming-records/
Bohdan
Почему в стейте постоянно начальное значение? Я что-то делаю не так?
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
Vladislav
Почему оно должно меняться?
Bohdan
Ну я же путаю новое, или?
Vladislav
Ну путаешь, а потом ничего с ним не делаешь
Bohdan
А что с ним делать нужно? Этот стейт каждый раз пересоздаётся, получается?
Vladislav
Разумеется
Vladislav
А как еще?
Vladislav
Это же чистая функция
Vladislav
Он не то что пересоздается, тут вообще переменных нет никаких
Vasiliy
погодите, что значит начальное значение?
Bohdan
Как тогда запоминать? Синглтон нужен?
Vasiliy
на выходе evalState должен быть 0
Vladislav
Какой синглтон?
Vasiliy
синглтон? :D
Vasiliy
глобальная переменная штоле?
Vladislav
ну да, а я так понимаю автор ожидает, что много раз если вызвать, то будет 0, -1, -2, etc
Vasiliy
да, видимо, так и есть
Vladislav
Если уж очень-очень хочется, то делается это через IORef
Vladislav
но лучше просто не делать так и не хотеть так
Vladislav
в конце концов в этом смысл чисто функционального программирования, что все компоненты ведут себя предсказуемо и состояния глобального не имеют
Vladislav
Вот если currentSpeed :: Float -> String, то это значит, что ты передаешь число, а получаешь строку на выход
Vladislav
и сколько ты эту функцию не вызывай, при каких обстоятельствах не вызывай, будет она возвращать одно и то же значение
Vladislav
потому что это *функция*
Vladislav
а не процедура
Bohdan
Ну суть такова: я пилю генератор плавно колеблющихся вокруг стартового значения чисел. stdgen выдаёт множитель, который меняет предыдущее выведенное значение. То есть без знания предыдущего числа тут ничё не выйдет
Vladislav
Ну так если тебе нужно работать со случайными числами, то ты уже не можешь писать чистые функции без монадического контекста. Тебе нужно использовать Rand
Vladislav
https://hackage.haskell.org/package/MonadRandom-0.5.1/docs/Control-Monad-Random-Strict.html
Ilya
так случайные числа можно же на стейте как раз написать?
Vasiliy
дык, если нужно просто знать предыдущее число, почему бы не передавать его аргументом?
Ilya
я даж писал 😆
Ilya
как упражнение
Vladislav
Vladislav
просто хелперов побольше для рандомной генерации
кана
Я же правильно понимаю, что а хаскеле тру зависимых типов никогда не будет из-за боттома, а если и будут, то доказывать ничего будет нельзя? Да и на core это как-то не кладется, сплошные хаки типа symbolVal будут
кана
Агда давно не обновлялась чет, идрис не продакшен реди (да че продакшен, тайпчек фильтра по вектору выжирает 10 гигов и виснет), хоть нравится мне он больше всех. Есть ли какие-то популярные хаскель-подобные языки с завтипами?
Хочу в эту тему углубиться, но вижу только coq и изабеле. Lean еще понравился
Arseniy
Слышал, что jetbrains что-то делали
Vladislav
> давно не обновлялась
Vladislav
Vladislav
Месье требовательный
Vladislav
Касательно зависимых типов в Haskell, доказывать будет можно, но пруфы нужно будет запускать в рантайме (чтобы исключить боттом).
Vladislav
Если пруф-тёрм высчитается и не будет bottom, то все доказано нормально. Это, конечно, удар по производительности, но не deal-breaker.
Vladislav
Но в качестве proof assistant он не сгодится все равно, конечно.
Vladislav
Точнее, будет неудобно, как ни крути.
Vladislav
Agda и Coq нормальные, если именно для доказательств.
Vladislav
А именно для программирования готовых хороших решений нет. Недавно видел, что John Wiegley генерирует Haskell на Coq. В итоге все доказательства на Coq, а компиляет это GHC, и работает оно хорошо.
Vladislav
Можно этот путь попробовать, потому что ему вроде нравится.
Alex
в Изабелле нет завтипов
кана
А, хм, на сайте у них просто последний релиз то ли 2014, то ли 2016)
Влод
F*
Влод
(раз в неделю этот вброс)
a66ath
Semigroup уже суперкласс Monoid в HEAD
Ruslan
123456
Ruslan
ну, вы все поняли😂
Нурлан
Vladislav
Флаг оптимизации меняет вывод программы с True на False
Нурлан
оуч...!!
Евгений
Евгений
Хотя по normalization theorem есть есть нормализация, то она единственна
Евгений
Но тут побочные эффекты!
Vladislav
Порядок редукции не должен ничего менять там, это был неправильный rewrite rule в библиотеке.
Vladislav
Какие побочные эффекты, в length и filter?
Евгений
В print
Vladislav
И что?
Vladislav
Теперь print должен менять то, что ему сказали распечатать, в зависимости от порядка редукции?
Anatolii
А можно подробнее объяснить как рулы так повлияли на результат?
Евгений
Vladislav
Типа, "а ладно, применю not, все равно побочные эффекты"