Антон
分解物質
"сколько монад надо чтобы интерпритировать brainfuck?"
Антон
Так, то есть при работе интепретатора придётся везде иметь дело с Just?
кана
нет, зачем
Антон
Тогда я не понял
кана
MaybeT же, а не Maybe
кана
кана
Тогда я не понял
MaybeT сам все хендлит, ты просто сможешь в любой момент с помощью stop остановить выполнение
кана
кана
execInterpreter вернет Tape _ 2 _
кана
то есть это как ExceptT, только когда есть ровно одна (или не важно, какая) причина для выхода
Антон
А нельзя было написать
mapM_ run where ... ?
кана
можно было
кана
но код не сегодняшний
Антон
Гм, я тут пытаюсь что-то с ST сделать, но там приходится newSTRef и modifySTRef использовать вместе с lift. Я что-то делаю не так или так и надо?
Антон
Т. е., lift в коде выше из-за линз нету?
кана
в коде выше State, а не ST
кана
и там modify/put/get же сразу с MonadState работают
кана
как и +=/-=/%=/.=
Alexander
Антон
Так, а чем тогда отличаются ST и State? Тем, что в первой настоящая мутабельность?
Alexander
да
Alexander
ну это meta ответ, через неё почти все выражается
Alexander
то, что хочет Fix/MonadFix вроде не выражается только
Антон
Alexander
вроде не должно, у нас все вычисление большое cont
Alexander
так RTS работает
Alexander
впрочем это все только с теор точки зрения интересно
Alexander
ну @kana_sama вроде все по делу ответил, так что разобраться в этом только
Антон
Антон
И ещё, можно Vector совместно с ST использовать или проще взять Data.Array.ST?
кана
ящетаю, что делать кату на хаскеле и брать ST - ну это такое
Антон
кана
так это же ката
кана
а не продакшен
кана
хрен с ним что копится
Антон
а не продакшен
Ну, пользователей просят код оценивать и с точки зрения продакшнпригодности
Алексей ayaye :)
Странного хочу. Есть функция. Хочется повторно использовать структуру шаблонов и гардов - сгенерировать другую функцию с той же структурой. Посмотрел на Template Haskell. Я правильно понимаю, что по готовой функции AST не получить, как по типу? Но можно обернуть её всю в скобочки и на выходе получить AST. А по нему восстановить изначальную функцию и сгенерировать другую?
Есть ли другие подходы? Пните в правильном направлении :)
Alexander
ST может быть в base стека
Alexander
другой подход это сделать класс на все методы
Alexander
но это плохой подход
Антон
Антон
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
а, для ST-шных надо
Alexander
ну сделай класс для STref
Alexander
если очень хочется
Alexander
(я хотя вчера говорил, что имхо это так себе решение)
Alexander
но код красивее будет
Антон
ну сделай класс для STref
Хм, а этом есть смысл. У меня по факту два объекта постоянно в памяти — указатель текущей позиции и вектор
Alexander
ну я про операции
Alexander
class MonadST m where
newSTRef :: a -> m t (STRef a)
default newSTRef :: MonadBase ST m => a -> m t (STRef a)
newSTRef = liftBase . ST.newSTRef
....
Alexander
что-то такое
Alexander
можно без дефолтной реализации
Антон
Так, я понял, что нифига не понял трансформеры монад
Антон
Гм, а почему для Vector.Mutable нет операции fromList?
Alexander
хороший вопрос!
Alexander
но ничего не мешает сделать unsafeThaw .. V.fromList
Alexander
или V.modify (...) . V.fromList
Dmitry
Антон
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
runST обавить?
Антон
Alexander
а ужеж есть
Alexander
lift $ do
x <- V.thaw . V.fromList $ p
newSTRef x
Alexander
=<< а не .
Alexander
твоем
Alexander
ну или как я написал, явно в 2 строки
Антон
Так, видимо, кату я уже завтра допишу
Aleksei (astynax)
Алексей ayaye :)
Anatolii
а можно как-то в одном модуле выключить все варнинги?
Dmitry
{-# OPTIONS_GHC -w #-} ?
Anatolii