Size: a a a

2021 January 13

AP

Aleksei (astynax) Pi... in Haskell Start
Два State или Reader чуть сложнее вместе использовать. Но и такое возможно.
источник

Oℕ

Oleg ℕizhnik in Haskell Start
Tel Asc
Вопрос прозвучит как что-то не совсем конкретное,но есть ли способы в Haskell каким-то образом использовать две монады параллельно?
Что-то вроде такого:
pbind :: (m a,g b) -> (a -> b -> (m c,g d)) -> (m c,g d).
Есть вариант сделать m,g трансформерами с IO,и передавать a,b в  IO,сначала сохранив их в IORef,а потом считывая  их из переменных.
Но это такое себе,но даже если отбросить как таковую чистоту,то все равно это не очень хорошее решение ,как мне кажется будет по скорости,и хотелось бы вариант побыстрее.
а какой пример конкретных m и g
источник

Oℕ

Oleg ℕizhnik in Haskell Start
как они могут быть вообще неизоморфны тут
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Да просто семантика разная может быть.
Сколько раз должна быть вызвана f в случае bind ([1,2,3], readLine) f? И сколько раз должен быть произведён ввод строки? По разу на каждое число? Только для первого? Один раз с передачей одной и той же строки для каждого числа?
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Трансформеры отвечают на этот вопрос: вложенность чётко диктует поведение. Которое отличается для "стейт во врайтере" и "врайтер в стейте", скажем.
источник

AP

Aleksei (astynax) Pi... in Haskell Start
И как этот bind должен реагировать на fail одной из веток?
источник

TA

Tel Asc in Haskell Start
Aleksei (astynax) Pirogov
И что значит "параллельно"? Трансформеры и работают параллельно — оба эффекта сохраняются при биндинге
То,что ты допустим можешь извлечь внутри такой "спаренной монады",результат из одного монадического значения,и передать в совершенно другое.
Для этого и нужен какой-то аналог pbind.
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Кроме того, из IO в принципе не сбежать так, чтобы получить "(IO ..., ...)"
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Tel Asc
То,что ты допустим можешь извлечь внутри такой "спаренной монады",результат из одного монадического значения,и передать в совершенно другое.
Для этого и нужен какой-то аналог pbind.
Спаренная монада — одна монада
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Вы можете написать такую, которая будет одновременно Reader и State, например. Будет быстрее, чем трансформер
источник

AP

Aleksei (astynax) Pi... in Haskell Start
mtl изначально для такого и создавался: чтобы для своих типов реализовывали MonadReader, MonadState, ... Правда, используют чаще всего именно трансформеры. Но и компилятор неплохо оптимизирует код на трансформерах, так что и быстротой жертвовать не приходится особо
источник

АК

Анатолий Кот... in Haskell Start
Ilya Kos
А у вас не возникнет проблемы с тем, что одна буква (é, например) не обязательно является одним Char?
да вроде один чар
источник

АК

Анатолий Кот... in Haskell Start
Aleksei (astynax) Pirogov
А касательно "проще", то кмк лучше сразу взять пакет вроде unicode-transforms, нормализовать и отбросить модификаторы...
спасибо, посмотрю
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Анатолий Кот
да вроде один чар
Замечание было связано с тем, что в Haskell значения Char могут содержать не весь "символ", а один code point. Особенно если символ откуда-то из дальних блоков Unicode. Поэтому код, которые должен работать на всём диапазоне символов, надо бы тестировать на умение отрабатывать такое вот разделение символа на несколько Chars.
источник

AP

Aleksei (astynax) Pi... in Haskell Start
(написал по памяти о том, как оно работает, может кто дополнит)
источник

IK

Ilya Kos in Haskell Start
Ну т е по-хорошему надо в начале просто нормализовать строку и все будет норм
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Ага. Я выше как раз и привёл пакет, который нормализует.
источник

AP

Aleksei (astynax) Pi... in Haskell Start
источник

AP

Aleksei (astynax) Pi... in Haskell Start
вот ещё пакет для работы с интернациональными текстами
источник

JS

Jerzy Syrowiecki in Haskell Start
Aragaer
а насколько будет нормальным вместо [ 'ë', 'é', 'è', 'ê'] написать "ëéèê"?
нормализация может незаметно сломать программу
источник