
kana
21.05.2018
18:23:30
какие исключения

Denis
21.05.2018
18:24:44
ну так вот вместо MaybeT можно ExceptT чтобы сказать чего упало

kana
21.05.2018
18:25:14
ну так я наоборот выше заменил ExceptT на MaybeT, потому что в задаче не требуется знать причин
только стейт финальный

Google

IC
21.05.2018
18:26:00
Ну мало ли что там в задаче. Это же ещё дебажить как-то надо.

kana
21.05.2018
18:27:02
так там в принципе вроде только одна причина для ошибки, которую можно явно отдать
ExceptT - не "ровно то, что требуется", хоть возможно то, что будет полезно в некоторых случаях

IC
21.05.2018
18:30:49
всегда можно either (const Nothing) Just сделать
https://theam.github.io/tintin/ всем документировать полчаса!

Антон
21.05.2018
18:40:24
Лента, ещё раз, конечная

分解物質
21.05.2018
18:43:15
"сколько монад надо чтобы интерпритировать brainfuck?"

kana
21.05.2018
18:45:10

Антон
21.05.2018
18:47:13
Так, то есть при работе интепретатора придётся везде иметь дело с Just?

kana
21.05.2018
18:47:23
нет, зачем

Антон
21.05.2018
18:47:31
Тогда я не понял

kana
21.05.2018
18:47:31
MaybeT же, а не Maybe

Google

kana
21.05.2018
18:48:15
Тогда я не понял
MaybeT сам все хендлит, ты просто сможешь в любой момент с помощью stop остановить выполнение
execInterpreter вернет Tape _ 2 _
то есть это как ExceptT, только когда есть ровно одна (или не важно, какая) причина для выхода

Антон
21.05.2018
18:52:49
А нельзя было написать
mapM_ run where ... ?

kana
21.05.2018
18:53:03
можно было
но код не сегодняшний

Антон
21.05.2018
18:54:53
Гм, я тут пытаюсь что-то с ST сделать, но там приходится newSTRef и modifySTRef использовать вместе с lift. Я что-то делаю не так или так и надо?
Т. е., lift в коде выше из-за линз нету?

kana
21.05.2018
18:55:35
в коде выше State, а не ST
и там modify/put/get же сразу с MonadState работают
как и +=/-=/%=/.=

Alexander
21.05.2018
18:59:34

Антон
21.05.2018
18:59:49
Так, а чем тогда отличаются ST и State? Тем, что в первой настоящая мутабельность?

Alexander
21.05.2018
19:00:03
да

Антон
21.05.2018
19:00:08

Alexander
21.05.2018
19:00:29
ну это meta ответ, через неё почти все выражается
то, что хочет Fix/MonadFix вроде не выражается только

Антон
21.05.2018
19:01:10

Alexander
21.05.2018
19:01:55
вроде не должно, у нас все вычисление большое cont

Google

Alexander
21.05.2018
19:02:00
так RTS работает
впрочем это все только с теор точки зрения интересно

Антон
21.05.2018
19:03:16

Alexander
21.05.2018
19:04:08
ну @kana_sama вроде все по делу ответил, так что разобраться в этом только

Антон
21.05.2018
19:13:08
И ещё, можно Vector совместно с ST использовать или проще взять Data.Array.ST?

kana
21.05.2018
19:17:50
ящетаю, что делать кату на хаскеле и брать ST - ну это такое

Антон
21.05.2018
19:18:29

kana
21.05.2018
19:18:34
так это же ката
а не продакшен
хрен с ним что копится

Антон
21.05.2018
19:19:10
а не продакшен
Ну, пользователей просят код оценивать и с точки зрения продакшнпригодности

Алексей Ayaye :)
21.05.2018
19:19:20
Странного хочу. Есть функция. Хочется повторно использовать структуру шаблонов и гардов - сгенерировать другую функцию с той же структурой. Посмотрел на Template Haskell. Я правильно понимаю, что по готовой функции AST не получить, как по типу? Но можно обернуть её всю в скобочки и на выходе получить AST. А по нему восстановить изначальную функцию и сгенерировать другую?
Есть ли другие подходы? Пните в правильном направлении :)

Alexander
21.05.2018
19:19:36
ST может быть в base стека
другой подход это сделать класс на все методы
но это плохой подход

Антон
21.05.2018
19:20:26
example x y = runST $ runMaybeT $ do
d <- lift $ newSTRef x
if (y == 0)
then(MaybeT $ pure Nothing)
else lift $ modifySTRef' d (`div` y)
lift $ readSTRef d

Alexander
21.05.2018
19:21:00
а, для ST-шных надо

Антон
21.05.2018
19:21:49

Google

Alexander
21.05.2018
19:22:03
ну сделай класс для STref
если очень хочется
(я хотя вчера говорил, что имхо это так себе решение)
но код красивее будет

Антон
21.05.2018
19:24:16
ну сделай класс для STref
Хм, а этом есть смысл. У меня по факту два объекта постоянно в памяти — указатель текущей позиции и вектор

Alexander
21.05.2018
19:24:43
ну я про операции
class MonadST m where
newSTRef :: a -> m t (STRef a)
default newSTRef :: MonadBase ST m => a -> m t (STRef a)
newSTRef = liftBase . ST.newSTRef
....
что-то такое
можно без дефолтной реализации

Антон
21.05.2018
19:31:17
Так, я понял, что нифига не понял трансформеры монад
Гм, а почему для Vector.Mutable нет операции fromList?

Alexander
21.05.2018
20:28:35
хороший вопрос!
но ничего не мешает сделать unsafeThaw .. V.fromList
или V.modify (...) . V.fromList

Dmitry
21.05.2018
20:36:46

Антон
21.05.2018
20:39:48
run :: Program -> Tape -> Tape
run p t = either id id $ runST $ runExceptT $ do
prog <- lift . newSTRef . V.thaw . V.fromList $ p
lift $ return [O]
Жалуется на
Haskell/SylarDoom/Smallfuck.hs:58:29:
No instance for (Control.Monad.Primitive.PrimMonad m0)
arising from a use of `V.thaw'
The type variable `m0' is ambiguous
Ну и как PrimMonad уточнить?

Alexander
21.05.2018
20:45:35
runST обавить?

Антон
21.05.2018
20:46:02

Alexander
21.05.2018
20:46:23
а ужеж есть

Google

Антон
21.05.2018
20:46:39

Alexander
21.05.2018
20:47:08
lift $ do
x <- V.thaw . V.fromList $ p
newSTRef x
=<< а не .

Антон
21.05.2018
20:48:16

Alexander
21.05.2018
20:48:23
твоем
ну или как я написал, явно в 2 строки

Антон
21.05.2018
20:56:36
Так, видимо, кату я уже завтра допишу

Aleksey
22.05.2018
05:04:51

Алексей Ayaye :)
22.05.2018
05:29:46

Anatolii
22.05.2018
05:47:52
а можно как-то в одном модуле выключить все варнинги?

Dmitry
22.05.2018
05:58:16
{-# OPTIONS_GHC -w #-} ?

Anatolii
22.05.2018
06:01:08

Aleksey
22.05.2018
06:04:07
Есть ещё вариант "какие-то-там (тут вроде бы топоним) скобки", но я его не помню :(

Алексей Ayaye :)
22.05.2018
06:06:53

Aleksey
22.05.2018
06:06:55
В контексте хаскеля разве что "квазицитирование" ещё встречал
Вроде как получить AST вне TH нельзя
Только если парсить исходник заново
А точно не получится обойтись комбинатором?