
Сергей
14.06.2018
14:38:20
да так можно о чем угодно говорить

kana
14.06.2018
14:38:30
мы в компайлтайме говорим, что этот код никогда не выполнится

Сергей
14.06.2018
14:38:47
ооок
чет это выглядит как-то абсурдно

Google

kana
14.06.2018
14:39:06
даже больше скажу
есть функция absurd : never -> a

Сергей
14.06.2018
14:39:19
funtion f(): number | never
и че будет

kana
14.06.2018
14:39:33
отдает значение ЛЮБОГО ТИПА, если ты передашь ей never

Aleh
14.06.2018
14:39:37
ну это тоже самое, что f(): number

kana
14.06.2018
14:39:40

Сергей
14.06.2018
14:39:53

kana
14.06.2018
14:39:58

Сергей
14.06.2018
14:40:01
то есть эксепшен пометить нельзя
то есть вы считаете, что вводить тип, с другим поведением, для одного кейса, было разумно?

Aleh
14.06.2018
14:41:03
иметь ноль для суммы типов вообще говоря полезно)

Сергей
14.06.2018
14:41:25

Google

Сергей
14.06.2018
14:41:39
а бля

Aleh
14.06.2018
14:41:41
empty же в flow

Сергей
14.06.2018
14:41:56
да ну нахуй
я чет понял, что писать в жс на таких типах — абсурд
будь это хаскель, окамл или ризон, да
но жиквери типизировать

kana
14.06.2018
14:43:27
у нас есть моноид (Type, |, empty)
то есть мы можем суммировать любые типы, empty/never - нейтральный элемент (то есть x | empty = x = empty | x)
у нас есть дуальный моноид (Type, Pair, void)
мы можем перемножать (делать кортежи) любых типов, при этом [x, void] = x = [void, x]
есть дистрибутивность:
[(a | b), c] = [a, c] | [b, c]
есть закон закон пересечения моноидов:
x * empty = empty = empty * x
все это можно понять, если заменить операции и значения на привычные тебе:
| = +
[,] = *
empty = 0
void = 1

Сергей
14.06.2018
14:43:32
и какой толк описывать функцию которую невозможно вызвать?

kana
14.06.2018
14:43:44

Сергей
14.06.2018
14:43:57

kana
14.06.2018
14:44:22
а описать-то его нужно например, или передать, или еще для чего

Сергей
14.06.2018
14:44:46
у нас есть моноид (Type, |, empty)
то есть мы можем суммировать любые типы, empty/never - нейтральный элемент (то есть x | empty = x = empty | x)
у нас есть дуальный моноид (Type, Pair, void)
мы можем перемножать (делать кортежи) любых типов, при этом [x, void] = x = [void, x]
есть дистрибутивность:
[(a | b), c] = [a, c] | [b, c]
есть закон закон пересечения моноидов:
x * empty = empty = empty * x
все это можно понять, если заменить операции и значения на привычные тебе:
| = +
[,] = *
empty = 0
void = 1
но пользу empty я так и не понял
конкретно из этого текста

kana
14.06.2018
14:44:49
в элме такие кейсы возникают например когда нужно в рендере сделать верстку, которая никогда не вызовет экшонов (Html Never)
или промис который никогда не упадет (и мы об этом знаем статически) (если бы мы типизировали обе ветки)
Promise<empty, x>
empty кажется бессмысленным точно так же, как id кажется бессмысленной функцией

Aleh
14.06.2018
14:46:07

kana
14.06.2018
14:46:10
а используется id довольно часто

Сергей
14.06.2018
14:46:22

Aleh
14.06.2018
14:46:44
а, это absurd называется да)

Google

Sergey
14.06.2018
14:46:48
откуда начинать читать?)

kana
14.06.2018
14:46:51
ну не конкетно такая
абсурд это когда еще возвращаем любой тип

Сергей
14.06.2018
14:47:09

kana
14.06.2018
14:47:22
function absurd<T>(x: never): T {
throw "absurd";
}

Сергей
14.06.2018
14:47:29

kana
14.06.2018
14:47:55
const x: number = switch ((x : 1)) {
case 1: 1;
case 2: absurd(x);
}
типа это значение x абсрудно и мы говорим об этом компилятору

Сергей
14.06.2018
14:51:40
в чем суть

kana
14.06.2018
14:52:57
ну конкретно в этом примере я показал для наглядности
но сам часто использую абсурд в default
чтобы потом когда тип расширится, компилятор мне скзаал, что тут ожидается never, а получен 10, добавь кейс

Сергей
14.06.2018
14:53:45
ну для number это не работает ж
для каких нибудь enum может быть
но я уловил
это костыль

Eugene
14.06.2018
14:54:35
тс - это костыль

Сергей
14.06.2018
14:54:40
часть кейсов с тем же switch и never должны срезаться когда появится паттерн матчинг

Алексей
14.06.2018
14:54:47

Google

Eugene
14.06.2018
14:54:53

Сергей
14.06.2018
14:54:54
жс — костыль
если уж на то пошло

Oleg
14.06.2018
14:55:08
+
flow - не нужен, как и js

Алексей
14.06.2018
14:55:18

Сергей
14.06.2018
14:55:19

Oleg
14.06.2018
14:55:23
го в пыхе шаблоны рендерить

Сергей
14.06.2018
14:55:29

Алексей
14.06.2018
14:55:42
костыль не сам жс, а как раз его безальтернативность

Eugene
14.06.2018
14:55:43
на котлине нормальный аналог jsx говорят люди

kana
14.06.2018
14:55:43

Сергей
14.06.2018
14:56:19
с чего бы
потому что тогда можно будет с помощью типизации чекать непроверенные ветки
и конкретно этот кейс уйдет в небытие

Aleh
14.06.2018
14:57:02
это костыль
в ТК это важный тип, не костыль. Точнее настолько же костыль, насколько число 0 костыль

Artur
14.06.2018
14:58:13
А я вот использовал тип {} там где хотел unknown

Aleh
14.06.2018
14:58:32

Сергей
14.06.2018
14:58:50

Artur
14.06.2018
14:58:58

Google

Aleh
14.06.2018
14:59:03
О.О

Сергей
14.06.2018
14:59:05

kana
14.06.2018
14:59:05
absurd - не костыль

Сергей
14.06.2018
14:59:22
лол

kana
14.06.2018
14:59:25
это то самое верное алгебраичное решение проверки на тип

Aleh
14.06.2018
14:59:26
также как в расте
прости, я только хеллоуворлды осилил и простенькие процесс-менеджеры
поэтому покажи)

Сергей
14.06.2018
14:59:28
я кажется снова перестал понимать

Artur
14.06.2018
14:59:40
но если strictNullChecks то оно и без absurd() корректно ругнётся,т не так ли?

Сергей
14.06.2018
14:59:56

kana
14.06.2018
15:00:00
absurd активно используют в пруверах например
так и называется

Сергей
14.06.2018
15:00:03
точнее как это в том же хаскеле выглядит

Aleh
14.06.2018
15:00:14
absurd :: Void -> a

kana
14.06.2018
15:00:18
absurd :: Void -> a
absurd x = case x of {}

Artur
14.06.2018
15:00:35

Aleh
14.06.2018
15:00:57
Unit эт другое, хотя хз как в скале

kana
14.06.2018
15:01:04
юнит - это у типа есть одно значение
и поэтому нам оно не важно

Artur
14.06.2018
15:01:19
https://www.scala-lang.org/api/2.12.x/scala/Unit.html