Alexander
Давайте для начала начнем с того, какого рода язык мы имеем?
Alexander
если там есть переменные, то наверно он отличается от хаскеля, а если отличается то наверно сильнее чем наличием переменных
Alexander
возможно там даже грязные функции есть
Big Bux Chungus
как я понимаю, он хочет лямбда исчисление, но зачем-то с переменными. я предлагаю использовать просто лямбда исчисление и реализовать переменные с помощью него
Андрей
эх, ладно, проехали
Big Bux Chungus
переменные становятся просто абстракцией использующей s -> (s, a)
Big Bux Chungus
я вижу только три варианта: 1) юзать IORef и хаскельный GC, 2) юзать Map Int Data и писать свой GC, 3) не давать юзеру newIORef и заставлять использовать State внутри языка
Big Bux Chungus
можно ещё юзать IORef с reference counting и запретить создание циклических ссылок
Big Bux Chungus
ну и аналогично можно и без IORef тогда обойтись
Alexander
использовать GC Haskell и делать ref counting /0
Anonymous
@nDanshin будет жить. Поприветствуем!
Oleg
В обычной просто-типизированой лямбде циклические референсы не выразимы, конечно же
Oleg
В раннем лиспе референс каунтеры внедрили именно потому что была доп-конструкция Cons
Oleg
Поэтому в общем случае потребность GC выражается доп. конструкциями
Oleg
Добавляю свой голос в число тех, кто полагает, что если будут циклические, то ничего лучше хост-GC всё равно не сделаешь
Oleg
Но даже если добавить в язык какой-то fix, можно всё равно сделать референс-каунтинг, учитывающий эти добавленные ссылки
Oleg
Смысл это всё имеет только если потеря переменной из скоупа должна иметь какую-то семантику в строящемся языке
Андрей
так разговор не про циклы, а про грязь
Oleg
Андрей
ref
Андрей
var
Oleg
А что с ними?
Андрей
блин, опять
Андрей
как их реализовать не используя ref - ы самого хаскеля и при этом не менеджить самому эту память
Oleg
Ну предложили же массив
Андрей
это и есть память
Андрей
своя
Андрей
которую gc хаскеля заберёт только когда весь массив не нужен будет
Oleg
Да. И, все и я указали, что в зависимости от языка, тебе нужен или не нужен гарбедж коллектор той или иной формы
Oleg
Слово var само по себе ни о чём не говорит
Oleg
Какова семантика?
Big Bux Chungus
если вары только локальные, то ГЦ не нужен
Андрей
функции, логические значения, вары
Андрей
вары типизируемые
Oleg
ты опять сказал "вары'
Big Bux Chungus
пример напиши в своём языке
Oleg
Могут ли вары ссылаться друг на друга
Oleg
Есть ли в языке индукиивные типы и какой формы
Oleg
Есть ли уникальность
Oleg
Гарбейдж коллектор появляется не тогда, когда у тебя есть вары и ссылки. А когда они начинают промоутиться вверх из скоупа опрелеления
Oleg
С помощью каких-то других определений
Андрей
а?
Андрей
промоутить?
Oleg
Например в чистом call-by-name любой вар или что там у тебя - это ссылка на выражение, она будеи вычисляться каждый раз при необходимости.
И тогда не нужно ни программного хипа, ни GC
Oleg
Поэтому нужно очень много деталей операционной семантики для рассуждений о контроле за памятью
Андрей
чувсвую сложность излишнюю в твоих речах )
Андрей
то, что многое зависит от семантики - согласен
Oleg
Мне, наоборот, кажется, что ты решил погрузиться в детали реализации, не имея хорошо сформулированного плана интерпретации
Oleg
Звучит, будто решил сделать интерпретатор интуитивно, с наскока
Oleg
А значит обсуждать тут нечего, делай как подсказывает сердце
Андрей
var f = (lambda x:Bool.
var z = 0
(lambda y:Bool. if x then z = z + 1 else z - 1))
f(true)
вот в той реализации, которую я в голове пока могу сложить, во второй строке, выражение var z = 0 мутирует какую-то память интепретатора, StateT, Map, etc - не суть
Андрей
вот когда f пропадёт из области видимости, память, которую она по сути заалоцировала в этом стейте, должна быть почищена ручками
Oleg
Oleg
А потом можно сказать, какой будет GC
Андрей
f возвращает функцию, которая инкрементирует счётчик z при true параметре и наоборот
Oleg
Потому что я могу вообразить как минимум пару форм, где GC не нужен
Oleg
Например, овнершип. Внутренняя лямбда объявляется овнером x, x исчезает вместе с ней.
При иниерпретации внутренняя лямбда превращает свой предыдущий завоненный стейт в следующий
KrivdaTheTriewe
Call-by-value всегда же будет в ситуации , когда gc не нужен
KrivdaTheTriewe
Ну и запрет на передачу ссылок
Андрей
Андрей
условно если я 1М таких функций навызывал, а потом перестал
Андрей
этот предыдущий стейт где находится?
Cheese
зачем вы разбиваете предложения на реплики? тяжело читать же
Oleg
предыдущий?
Да. В семантике, где у тебя есть функции с овненным скрытым стейтом, ты имеешь каждый раз в скоупе функцию и последний актуальный стейт для неё.
Oleg
Big Bux Chungus
f = \_ -> {
var z = 1
(\_ -> { z += 1; z },
\_ -> { z -= 1; z })
}
f = \_ -> {
var z = \_ -> 1
(\_ -> { z 2 },
\f -> { z = f; () })
}
(a, b) = f()
b(a)
если оба примера должны работать в этом гипотетическом языке, то без ГЦ не обойтись
Big Bux Chungus
если запретить var f : a -> b (и полиморфные varы, если есть полиморфизм), то можно обойтись reference counting
Андрей
а интерпретаторы с reference counting вообще существуют? )
Big Bux Chungus
а почему нет
A64m
Алексей
Алексей
Но рефкаунт есть.
Гриша
Anonymous
@seqai будет жить. Поприветствуем!
Artem
Всем привет.
У меня есть возможность в Haskell сделать литеральный тип вроде такого:
```type NaturalNum = 1 | 2 | 3```Или как поступать в том случае, если хочешь ограничить аргумент на уровне типа?
P.S.
Хотелось бы сделать подмножество определенного типа
кана
1) One | Two | Three
2) пруф-типы
module OneTwoThree (make, get) where
newtype OneTwoThree = OneTwoThree { get :: Int }
make :: Int -> Maybe OneTwoThree
make x | x elem [1, 2, 3] = Just $ OneTwoThree x
| otherwise = Nothing
module Main where
import qualifed OneTwoThree
import OneTwoThree (OneTwoThree)
f :: OneTwoThree -> String
f (OneTwoThree.get -> 1) = "1"
f (OneTwoThree.get -> 2) = "2"
f (OneTwoThree.get -> 3) = "3"
main = do
input <- read <$> getLine
case OneTwoThree.make input of
Just x -> putStrLn (f x)
Nothing -> do
print "error"
main
Ilya
Artem
Спасибо)
A64m
смотря для чего тип, если для каких-то проверок, то лучше ликвид хаскель
если для выведения кода - ликвид хаскель не годится, придется с синглетонами страдать