Max
Как-то очень медленно. В JS-react чате ~3k людей, а в Elm < 100
Нас спасает технофашистские методы работы
Danila Matveev
'>' переход или сравнение?
Anonymous
а жс-еры въедут в elm ?
Почему нет? Въезжают и радуются. Столько костей же сломали без статической проверки типов. Тайпскрипт –– не панацея. А элм всё скажет, всё расскажет, место в коде покажет. Надо лишь попробовать.
Aleksei (astynax)
Как-то очень медленно. В JS-react чате ~3k людей, а в Elm < 100
Потому как официальный пруд, где они водятся и нерестятся, это эльмослак - там тысячи их
Влод
Почему нет? Въезжают и радуются. Столько костей же сломали без статической проверки типов. Тайпскрипт –– не панацея. А элм всё скажет, всё расскажет, место в коде покажет. Надо лишь попробовать.
кстати, да. ограниченность статической системы типов даёт больше возможностей для диагностики ошибок. это как в го, только в го нужно interface {} делать, что совсем больно
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
Элм выучить проще жс-а в разы с нуля.
Влод
Даёт больше возможностей допустить ошибки по причине невозможности достаточно хорошо закодировать домен, вы хотите сказать?
ну в хаскеле обычно получаешь ошибку что нет инстанса там то там то. хотя в большинстве случаев поможет не определение инстанса а подстановка нужно аргумента (легко запутаться когда применение через пробел записывается)
Anonymous
Даёт больше возможностей допустить ошибки по причине невозможности достаточно хорошо закодировать домен, вы хотите сказать?
Скорее всего имелось в виду, что строгая типизация даёт больше возможностей для хорошей диагностики с подсказками и прочей дружественностью
Oleg
haskerro > haskelly
Haskerro работает хорошо, спасибо
Влод
Haskerro работает хорошо, спасибо
пишет тип для сущности?
Oleg
пишет тип для сущности?
При наведении курсора - да :)
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
Слушайте, а тип Void -> a населен?
Конечно, потому что это id :)
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
кана
Не про хаскель я говорю, нету undefined никакого
Vladislav
Да, речь-то не про Haskell
Vladislav
иначе везде +1 надо делать в алгебре, чтобы боттом учитывать
Ilya
Не про хаскель я говорю, нету undefined никакого
понял, т.е. у тебя Void это пустой тип?
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
А я могу доказать ее противоречивость предоставив функцию 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