kir
18.02.2018
09:22:00
Можно ещё сделать операцию view для получения слепка линейной переменной на момент вызова
Oleg
18.02.2018
09:23:53
это в любом случае сводится к сортам вайла как к сортам рекурсии
Google
kir
18.02.2018
09:29:15
Я думаю, можно обойтись правилом, что линейные переменные unduppable, добавление их в замыкание (и любые другие базовые структуры) делает их тоже unduppable.
While-то, по сути, не должен дублировать "счётчик цикла", это задача блока-замыкания.
Oleg
18.02.2018
09:31:13
kir
18.02.2018
09:33:13
Что мешает запретить для них и drop тоже? Если язык продуман корректно, то у тебя не должно быть способа избавиться от/удвоить линейную переменную на стеке.
Oleg
18.02.2018
09:33:22
kir
18.02.2018
09:34:25
#а S -> а #а S кладет на стек копию текущего состояния линейной переменной
Oleg
18.02.2018
09:36:01
#а - это линейная или интуиционисткая?
kir
18.02.2018
09:37:17
Да не у переменной копия, а у её текущего состояния. Переменная дальше может меняться, а копия остаётся "замороженной". Линейная.
Oleg
18.02.2018
09:38:34
kir
18.02.2018
09:39:07
Это как readIORef
Oleg
18.02.2018
09:39:14
Полагаю, говоря о линейных типах мы должны смириться с тем, что способа скопировать линейную переменную нет
Google
kir
18.02.2018
09:40:02
Чтобы ты не мог скопировать саму переменную вместе с её возможностью меняться, но мог выяснить её состояние
Oleg
18.02.2018
09:41:04
Это как readIORef
Но линейная переменная она гораздо дальше, чем IORef в семантике. Что если копия состояния содержит какие-то технические указатели например на хэндл для чтения из файлов и этот снэпшот переживёт закрытие файла?
Ну или если мы говорим о квантовых вычислениях, у нас вообще нет снэпшотов состояния
kir
18.02.2018
09:42:03
Тогда надо сделать подкласс линейных типов, которым можно сделать view
Где мы, а где квантовые вычисления :)
Oleg
18.02.2018
09:43:06
Ну на самом деле обычно делают наоборот, просто !А, и функцию !A -> A
ну или точнее
!(!A -o A)
вместо viewable - тот факт, что интуиционистскую переменную ты можешь отсекать как линейный разовый срез
kir
18.02.2018
09:45:21
Результат перестает быть линейным, или его линейность встроена в -о?
Oleg
18.02.2018
09:46:07
kir
18.02.2018
09:48:00
А, вот оно что
Mink
18.02.2018
09:55:31
Svyatoslav
18.02.2018
09:56:15
Mink
18.02.2018
10:05:06
Значит действительно чудеса)
Svyatoslav
18.02.2018
10:22:57
да, обидно )
совсем нет идеи как починить )
Mikhail
18.02.2018
14:21:38
Проблема.
computeOffsets :: [ASMLine] -> [ASMLine]
computeOffsets [] = []
computeOffsets (a:as) = let
t = length (uniteBytecode (a:as))
v = foldl (+) 0 [ t - length (bytecode x) | x <- as ]
in a {offset = v}: computeOffsets as
t = length (uniteBytecode (a:as)) выполняется много раз, а надо чтоб один. При этом хотелось бы обойтись без do
хотя тут наверное непонятно у меня
Google
Mikhail
18.02.2018
14:24:54
uniteBytecode :: [ASMLine] -> String
uniteBytecode asm = foldl (++) "" [ bytecode x | x <- asm ]
kir
18.02.2018
14:25:09
* encounters line break after let
* throw `ParseError`s
Mikhail
18.02.2018
14:25:12
data ASMLine = ASMLine -- String String
{ instr :: String
, operand :: String
, bytecode :: String
, offset :: Int
}
deriving (Eq)
ну мне удобнее line break after let
строчки экономлю
оно 100% законно
kir
18.02.2018
14:27:43
Да так даже читаемее, на самом деле.
> bytecode :: String
Я вот не помню. Любая ли байтовая последователность ли представима в виде Char?
foldl (++) "" можно смело заменить на concat или mconcat.
Экономишь туалетную^W бумагу для принтера?
Mikhail
18.02.2018
14:28:49
ага, спс
Artyom
18.02.2018
14:29:07
> Любая ли байтовая последователность ли представима в виде Char?
да, но зачем
kir
18.02.2018
14:29:10
Во, ещё лучше!
uniteBytecode = (bytecode =<<)
Mikhail
18.02.2018
14:29:14
код считает оффсеты строчки от начала
а получаются оффсеты от конца
kir
18.02.2018
14:30:07
foldl (+) 0 заменимо на sum
Mikhail
18.02.2018
14:30:08
и чтобы получить - таки оффсеты от начала, я хочу взять длину всего байткода минус оффсет от конца
t - length (bytecode x)
kir
18.02.2018
14:33:52
type String = [Char]
bytecode :: ASMLine -> String => bytecode :: ASMLine -> [Char]
concatMap :: (a -> [b]) -> [a] -> [b] (flipped concatMap)
assume a ~ ASMLIne, b ~ Char
=> concatMap bytecode :: ASMLine -> [Char] => concatMap bytecode :: ASMLine -> String
В общем, uniteBytecode = concatMap bytecode, что выражает
@termslang чтобы не считать два раза, можно протащить параметр-аккумулятор длины
И попытайся выразить через foldl или foldr
Google
kir
18.02.2018
14:38:21
Всю computeOffsets, я имею ввиду. Кстати, зачем compute? Почему просто не offsets?
Мы ж не в жаве
Mikhail
18.02.2018
14:38:50
потому что оно будет меняться тыщу раз
kir
18.02.2018
14:39:37
Что будет меняться-то? У нас тут иммутабельность и функциональная чистота, вроде как
Достаточно просто написать в документации, что оно O(n^2), например
Mikhail
18.02.2018
14:40:52
у меня все норм с иммутабельностью
вот main
module Main where
import System.Environment
import Emasm
main :: IO ()
main = getArgs
>>= return . head
>>= readFile
>>= return . parseAsmFileContents
>>= return . unfoldPseudoasm
-- >>= return . splitInitSection
>>= return . computeBytecode
-- >>= return . uniteBytecode
-- >>= return . addLoader
-- >>= print
>>= mapM_ print
kir
18.02.2018
14:41:19
Технически, можно сделать zip... господи
Mikhail
18.02.2018
14:41:26
offsets больше звучит как переменная
kir
18.02.2018
14:42:38
У нас тут своя атмсфера и переменные живут в модулях Data.IORef и Control.Concurrent.
Ты из принципов не используешь do-syntax?
Mikhail
18.02.2018
14:42:59
говорят это плохо
Dmitry
18.02.2018
14:43:15
Кто?
Mikhail
18.02.2018
14:43:48
https://wiki.haskell.org/Do_notation_considered_harmful
kir
18.02.2018
14:43:56
Исходную задачу можно сделать, как zip asmLines (scanl _offset [] (map bytecode asmLines)), и останется реализовать только _offset.
Vyacheslav
18.02.2018
14:44:34
Dmitry
18.02.2018
14:44:51
Ньюкомерс майт think
kir
18.02.2018
14:45:00
Если поискать, можно и мнение о том, что Monads considered harmful найти. Зачем верить всему подряд?
Dmitry
18.02.2018
14:45:04
Ну понятно. Кто автор?
Mikhail
18.02.2018
14:45:14
ну без монад никак же
Google
Mikhail
18.02.2018
14:45:20
а без do можно
аргументация норм вроде
Dmitry
18.02.2018
14:45:43
И без монад можно, какие проблемы
kir
18.02.2018
14:46:17
+1, на продолжениях всё делать, как в '92 было
как в Node.js
Vyacheslav
18.02.2018
14:46:42
Надо на самом деле надо прочитать просто эту статью в вики
и там примерно во втором абзаце, в топике Didactics написано, что имеется ввиду
kir
18.02.2018
14:47:14
А не только её заголовок :)
Mikhail
18.02.2018
14:47:34
ну где-то кроме монад do лепить точно не надо
Vyacheslav
18.02.2018
14:47:55
а где-то кроме монад в хаскелле можно?
Mikhail
18.02.2018
14:47:57
там побочные жффекты описываются
Dmitry
18.02.2018
14:48:38
ApplicativeDo ?
kir
18.02.2018
14:48:54
Где-то кроме монад заюзать do-нотацию будет затрднительно, потому как оно переписывается в вызовы (>>=) и (>>), ну и (*>), да
Vyacheslav
18.02.2018
14:50:01
В общем, нормально все с do-нотацией, ее вполне можно использовать, часто она улучшает читаемость кода.
kir
18.02.2018
14:50:08
В monadic expression описывается последовательность действий, если что
Vyacheslav
18.02.2018
14:50:51
kir
18.02.2018
14:51:11
Вброшу https://blog.jle.im/entry/io-monad-considered-harmful.html
Vyacheslav
18.02.2018
14:52:13
На самом деле клево было бы в целом просто отвязать do-нотацию от монад, аппликативов и привязать просто к оператору >>=
kir
18.02.2018
14:53:30
{-# language RebindableSyntax #-}?
https://ocharles.org.uk/blog/guest-posts/2014-12-06-rebindable-syntax.html @termina1