Max
Влод
Danila Matveev
'>' переход или сравнение?
Anonymous
а жс-еры въедут в elm ?
Почему нет? Въезжают и радуются. Столько костей же сломали без статической проверки типов. Тайпскрипт –– не панацея. А элм всё скажет, всё расскажет, место в коде покажет. Надо лишь попробовать.
Влод
Влод
Aleksei (astynax)
Даёт больше возможностей допустить ошибки по причине невозможности достаточно хорошо закодировать домен, вы хотите сказать?
Aleksei (astynax)
Иначе Брейнфак всё бы зарулил - там один тип только и есть, вот уж где точно "легко диагностировать ошибки" :)
Дима
malbolge
Aleksei (astynax)
Не, malbolge, это уже спецолимпиада. Типа Perl6
Anonymous
Ну вообще про весь этот элм уже давно сказано:
Formal methods will never have a significant impact until they can be used by people that don’t understand them.
Ну, вот мы и пришли, собственно.
Anonymous
Элм выучить проще жс-а в разы с нуля.
Влод
Danila Matveev
кстати, для этого нет хоткея как в идее?
Зигохистоморфный
А как же рефлекс для фронта?)
кана
Слушайте, а тип Void -> a населен?
Anonymous
Боттомом как минимум :)
кана
я знаю про absurd, но я не очень понимаю, как может существовать функция, которая ничего не принимает
кана
ну, если бы не было bottom
Alexander
absurd :: Void -> a она не ничего не принимает, а принимает ничего
Vasiliy
absurd a = let x = absurd a in x
Vasiliy
только она вернёт боттом
Alexander
ну это не удивительно
Alexander
нужно может быть если есть, например какая-нить бесконечная функция, типа forever blabla её логично сделать тип m Void, но если вдруг по каким-то причинам надо её композить с другой, например всякими примитивами из async то там иногда нужно вызывать absurd
Vladislav
Vladislav
Void можно рассматривать как forall a. a
Alexander
эм...
Vladislav
newtype Void = Void { absurd :: forall a. a }
data Void
написать изоморфизм - упражнение читателю
Alexander
это то понятно, вот "потому что это id" как-то неочевидно, что так
Vladislav
это id up to isomorphism
Vladislav
То есть для одного из возможных определений Void это просто unwrapping ньютайп-конструктора
кана
кана
не существует же функции Void -> Void
кана
как и любой другой a -> Void
Vladislav
id
Vladislav
Void -> Void это точно id без оговорок даже
Vladislav
Количество функций считается как степень
Vladislav
0^0 = 1
Vladislav
как и любое x^0 = 1
Vladislav
поэтому функций Void -> a всегда 1 для любого a, и это absurd
Vladislav
а в случае Void -> Void просто absurd = id
Ilya
кана
Не про хаскель я говорю, нету undefined никакого
Vladislav
Да, речь-то не про Haskell
Vladislav
иначе везде +1 надо делать в алгебре, чтобы боттом учитывать
Ilya
Ilya
даже без боттома
Vladislav
Точнее, речь про идеализированный Haskell без боттомов (как и в любых рассуждениях такого уровня)
Vladislav
Void и задуман как пустой тип
Ilya
@ind_index тогда поясни ещё раз, пожалуйста, почему функций Void -> Void одна штука
Ilya
аргумент со степенью мне кажется формальным
Ilya
точнее, лучше так вопрос поставлю
Ilya
в противоречие с какими аксиомами я войду, если скажу, что функций с типом "пустой тип -> пустой тип" ноль штук, а не одна штука?
кана
а, хм, я понял, почему
Ilya
давай
кана
я в одном своем посте представлял функцию как таблицу результатов.
То есть имя тип data ABC = A | B | Cи функию
isA : ABC -> Bool
isA A = True
isA _ = Falseможно составить таблицу (кортеж Bool ^ n, где n = |ABC|)
-- A B C
(True, False, False)
То есть каждому i-ому значению типа ABC соответствует i-ый элемент этого кортежа.
Для типа 0 -> 0 это пустой кортеж (), ведь каждому значению Void соответствует некоторое значение Void.
кана
это () это и есть единичный тип
Vladislav
Vladislav
А я могу доказать ее противоречивость предоставив функцию id
Vladislav
я имею id :: forall a. a -> a, что мне мешает взять a = Void?
Vladislav
Я объясню вам сейчас интуитивно, что такое Void
кана
функция действительно для каждого элемента Void отдает элемент Void
Vladislav
функция a -> Void написана быть не может, потому что она должна вернуть результат, которого не может быть (по определению Void)
а если уж вам удалось в текущем контексте получить Void, то это значит, что текущий кусок кода в рантайме не выполнится никогда!
Vladislav
потому что нет ни одного способа ему этот Void предоставить
Vladislav
а оттого функция Void -> a как бы говорит "вызови меня если сможешь, я тебе дам взамен что угодно, любое a"
Vladislav
Да только вызвать ты ее не сможешь, а потому функция может ничего и не делать
Vladislav
любую функцию можно определить переобором конструкторов, например, если на вход (), то
f () = ...
если на вход Bool, то
f True = ...
f False = ...
если на вход Maybe a, то
f Nothing = ...
f (Just a) = ...
а если на вход Void, то
f
Vladislav
что записывается как f = \case{} в Haskell и как f () вместо f = ... в Agda
Vladislav
Например, если я имею Either Void (), то я могу сконструировать только Right (), но никогда никакого Left ... не будет в жизни, не сконструирую никак
Vladislav
а потом функция, которая хочет принять Either Void (), может писать
f (Left e) = absurd e
Vladislav
и в рантайме этого codepath и не будет никогда
Vladislav
потому что это абсурд, будто кто-то нам Void передал
Евгений
Я не очень понимаю про что вы говорите, вы про какой-то фиксированный type theory, про инлайн логику топоса или про тьюринг-полные языки?
Vladislav
Про любой total functional language с inductive type definitions