@haskellru

Страница 851 из 1551
kir
18.02.2018
09:22:00
не понял оба предложения. 1.Придётся делать dup входного параметра или замыкания? 2. Какие более базовые операции, чем while / cond?
1) Придется делать dup параметра, перед тем как сделать prepend к замыканию. После этого, правда, можно сделать dup самому замыканию, если оно не становится unduppable. 2) Эээ? Рекурсию отменили?

Можно ещё сделать операцию view для получения слепка линейной переменной на момент вызова

Oleg
18.02.2018
09:23:53
1) Придется делать dup параметра, перед тем как сделать prepend к замыканию. После этого, правда, можно сделать dup самому замыканию, если оно не становится unduppable. 2) Эээ? Рекурсию отменили?
не, мне просто интересно, потому что в линтипах много может быть разных рекурсий, в зависимости от того, что у тебя там за замыкание и что под экспонентой

это в любом случае сводится к сортам вайла как к сортам рекурсии

Google
kir
18.02.2018
09:29:15
Я думаю, можно обойтись правилом, что линейные переменные unduppable, добавление их в замыкание (и любые другие базовые структуры) делает их тоже unduppable. While-то, по сути, не должен дублировать "счётчик цикла", это задача блока-замыкания.

это в любом случае сводится к сортам вайла как к сортам рекурсии
И блок-то может вообще начинаться с view, после чего его можно использовать где угодно

kir
18.02.2018
09:33:13
Что мешает запретить для них и drop тоже? Если язык продуман корректно, то у тебя не должно быть способа избавиться от/удвоить линейную переменную на стеке.

kir
18.02.2018
09:34:25
#а S -> а #а S кладет на стек копию текущего состояния линейной переменной

Oleg
18.02.2018
09:36:01
#а S -> а #а S кладет на стек копию текущего состояния линейной переменной
ммммммм, совсем запутался. Откуда у линейной переменной копии?

#а - это линейная или интуиционисткая?

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
Результат перестает быть линейным, или его линейность встроена в -о?
не, там наоборот A - это линейная, а экспонента !A - многоразовая интуиционистская

kir
18.02.2018
09:48:00
А, вот оно что

Mink
18.02.2018
09:55:31
вообще странно что файервол может так избирательно блокировать
Переменная среды %http_proxy% случайно определена?

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
https://wiki.haskell.org/Do_notation_considered_harmful
там не написано, что плохо, написано что иногда плохо

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
ApplicativeDo ?
о, норм, не видел такого

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

Страница 851 из 1551