Сохранен 23
https://2ch.su/b/res/324591782.html
Сообщите нам если начиная с сентября вы испытываете проблемы с доступом к сайту через клирнет, сразу укажите сообщение об ошибке или приложите скриншот.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

Анон, есть ли язык программирования, система типов которого основана на теории множеств? Теория множ

 Аноним 17/09/25 Срд 21:45:45 #1 №324591782 
e746a8f380275124fa112db331d808ad-1496596003.jpg
Анон, есть ли язык программирования, система типов которого основана на теории множеств? Теория множеств не только интуитивно понятна и идеально ложится на теорию типов, но и даёт очень мощные концепции, такие как subtyping.

Пусть у нас будет базовый тип (тип-юниверсум) Binary — множество всех бинарных данных, в том числе: Complex — множество комплексных чисел (которое в свою очередь включает все остальные типы чисел по цепочке), List - списки (которые включает String, то текст - список символов), Vector (который включает матрицы, ибо матрица - это вектор векторов), и так далее.

Я знаю, что Prolog во многом основан на Set Theory, но вот чтобы сама система типов была на ней основана, еще ни разу не видел.
sage[mailto:sage] Аноним 17/09/25 Срд 21:48:19 #2 №324591843 
>>324591782 (OP)
Так ты можешь свои типы создать в любом языке. В чем проблема?
Аноним 17/09/25 Срд 21:52:22 #3 №324591991 
>>324591843
Окей, создай в ${язык-нейм} тип данных, включающий натуральные числа от 0 до 11, то есть подтип Nat, и который является кольцом по модулю 12.

Жду.
sage[mailto:sage] Аноним 17/09/25 Срд 21:56:11 #4 №324592105 
>>324591991
Блять можно вообще функцией ебануть, анон

int AddMod12(int a, int b) => (a + b) % 12;
sage[mailto:sage] Аноним 17/09/25 Срд 21:57:09 #5 №324592130 
>>324592105
А тип данных вот

public class Mod12
{
private readonly int v;

public Mod12(int value) => v = ((value % 12) + 12) % 12;

public static Mod12 operator +(Mod12 a, Mod12 b) => new(a.v + b.v);
public static Mod12 operator -(Mod12 a, Mod12 b) => new(a.v - b.v);
public static Mod12 operator (Mod12 a, Mod12 b) => new(a.v b.v);

public override string ToString() => v.ToString();
}
Аноним 17/09/25 Срд 22:02:05 #6 №324592270 
>>324591782 (OP)
Typescript

https://ivov.dev/notes/typescript-and-set-theory

https://thoughtspile.github.io/2023/01/23/typescript-sets/
Аноним 17/09/25 Срд 22:15:35 #7 №324592701 
>>324592105
Вот только это всё в рантайме. Я говорю, чтобы всё было на уровне типов.

Day = Modulo Nat 12 # Модуль над множеством натуральных
a :: Day
a = 11
b :: Day
b = 1
main = a + b |> toString ~> stdout # Выведет 0

Можем придумать пример поинтересней: тип который описывает строки являющиеся валидными URL адрессами.
К примеру пусть будет функция send(URL, Binary).
Строчка send("Hello world!", "hi") отлетит с ошибкой еще на этапе компиляции.

Ну или более банальный, но важный пример RGB:
Опишем RGB как вектор:
RGB = Vector (RGBComponent, 3)
RGBComponent = Range (Nat, 0, 255)

И теперь и соответсвенно код типа
Button {
color: (400,500,100)
}

Просто не скомпилируется.

А у тебя вообще не происходит поддтипирования, ты оборачиваешь int в контейнер-класс. И я просил именно натуральные числа, а не int. Твой код обосрется, как только value будет отрицательным, а компилятор даже не пискнет на этот счет.
sage[mailto:sage] Аноним 17/09/25 Срд 22:24:02 #8 №324592970 
>>324592701
Всё так, но это фиксится рутинно костылями, чтобы код не обосрался.

btw тебе нужен Idris, Agda, F* или что-то такое. Но я вообще в душе не ебу что это за срань
Аноним 17/09/25 Срд 22:26:56 #9 №324593053 
>>324592270
Кстати, typescript очень близок. Там еще и типы зависимые. Для полноты картины только линейных/аффинных типов не хватает.
Аноним 17/09/25 Срд 22:29:31 #10 №324593127 
>>324591782 (OP)
Если брать алгебраические типы, то как бы любой тип - это по определению множество значений. На это множество значений накладываются операции сложения и умножения. Еще иногда, очень редко встречается вычитание, например в js. Деление хз.
Что именно тебе надо-то?
Аноним 17/09/25 Срд 22:33:03 #11 №324593219 
>>324593053
>Там еще и типы зависимые.
Откуда они там? Или какая-то порезанная версия?
Аноним OP 17/09/25 Срд 22:36:51 #12 №324593322 
>>324593127
ADT в хаскелл это скорее про Теорию Категорий, а не про Теорию Множеств. Да и у них есть свои ограничения. К примеру ты не можешь сложить целое число с рациональным. Хотя вообще-то абсолютно любое целое число является рациональным, а значит никакой ошибки быть не может, такая операция допустима. Но GHC не пропустит.
Аноним OP 17/09/25 Срд 22:39:11 #13 №324593384 
>>324593219
Забавно, но факт.

https://www.hacklewayne.com/dependent-types-in-typescript-seriously
Аноним 17/09/25 Срд 22:41:52 #14 №324593452 
Посмотри в сторону ZIG
Там можно через comptime запилить примерно то, что ты хочешь (но не полностью, естесна)
Аноним 17/09/25 Срд 22:45:03 #15 №324593562 
image.png
>>324593322
>К примеру ты не можешь сложить целое число с рациональным.
Пик. Расскажешь почему это работает?
>скорее про Теорию Категорий, а не про Теорию Множеств.
Теоркат идет во всяких монадах и прочем говне. ADT причем тут? Это именно теория множеств. Ты легко можешь сделать множество любое, единственное ограничение, что там нельзя сделать бесконечные множетсва. Типа скажем натуральные. Но это ограничения компуктера в общем, а не ADT.
Аноним 17/09/25 Срд 22:52:10 #16 №324593777 
image.png
>>324593562
Ну и именно с рациональными.
Аноним 17/09/25 Срд 22:58:22 #17 №324593978 
>>324593562
>Типа скажем натуральные.
dat Nat = Z | S Nat

> бесконечные множетсва
Ко-типы. Хаскелл вообще крут, когда речь заходит о бесконечностях.
Аноним 17/09/25 Срд 23:02:47 #18 №324594085 
>>324593978
Вычитание для такого "натурального" числа напиши. А потом деление. Хотя возможно в этом случае и сложение уже сложно, нинаю.

Не ну обычно эти множества, которые счетные бесконечные задаются через условия. Так-то наверное ты прав, действительно можно и бесконечности задать.
В любом случае, мне интуитивно всегда казалось, что тип = множество. И так и не понел, что оп хочет.
Аноним 17/09/25 Срд 23:17:56 #19 №324594462 
>>324594085
> Вычитание для такого "натурального" числа напиши.
Вычитание не опеределено для натуральных чисел, деление не определено для целых. А вот сложение изи:
(+) :: Nat -> Nat -> Nat
S x + y = x + S y
Z + y = y

>>324594085
>И так и не понел, что оп хочет.
Он имел в виду определение типов через операции над множествами, как я понял.
К примеру операция деления (x / y) имеет сигнатуру x ∋ Q, y ∋ Q \ {0}.
То есть при компиляции у нас должны быть гарантии что в y никак не может попасть 0, иначе нескомпилируется, а значит есть гарантия, что division by zero exeption никогда не вылезет в рантайме.
Аноним 17/09/25 Срд 23:25:31 #20 №324594655 
>>324594462
>Вычитание не опеределено для натуральных чисел
Ну сделай не натуральными. Это же нумералы черча, я точно помню какая жопа реализовать там вычитание. Вот и хочу чтобы ты показал мастер класс.

А это точно экзепшен должен быть, а не скажем bottom?
Аноним 18/09/25 Чтв 00:02:55 #21 №324595342 
>>324591782 (OP)
>Binary — множество всех бинарных данных
ну вот например object, вообще общий тип
>omplex — множество комплексных чисел
эта хуйня только в математике нужна. можешь импортнуть библиотеку или сам написать классец за пару минут с реализацией операций
>List - списки (которые включает String, то текст - список символов)
можешь хранить символы в листе, но тебе нужны специализированные для строк операции, поэтому отдельная сущность
>Vector (который включает матрицы, ибо матрица - это вектор векторов), и так далее.
ну так лол ты можешь вектор векторов везде хранить, шаблонизация

кароч ты либо жирный, либо тупой даун, претендующий на интеллект, но жестко не вывозящий
Аноним 18/09/25 Чтв 01:02:56 #22 №324596571 
>>324591782 (OP)
понимаю что такое не спрашивают, и не в этом суть, но просто ответь - что это даст? Да, может будет удобнее, без лишних прослоек, компилируемо, но речь про функциональность - что это даст, в каких областях есть проблемы которые этим решают?
Аноним 18/09/25 Чтв 01:26:33 #23 №324596994 
>>324591782 (OP)
> система типов которого основана на теории множеств?
Трейты в Rust, очевидно же.
Естесно, что множества можно ограничивать.
comments powered by Disqus