
Alex
02.10.2017
10:30:00
спасибо

Kelin
02.10.2017
12:16:34
А это разве быстро?

Павел
02.10.2017
12:48:47
В хаскеле - да

Denis
02.10.2017
12:50:04
в лени да

Google

Дмитрий
02.10.2017
12:53:06
На оба поста ответ нет
По крайней мере автор не справился
Но естественно это не значит что это невозможно, просто как факт — текущая имплементация — не быстрая
Насколько можно об этом говорить в хаскеле

illiatshurotshka❄️
02.10.2017
12:55:35
хммм
а какое применение?

kana
02.10.2017
12:56:55
@ZeroBias как делать полиморфные константы?
const nil: List<T> = new Nil<T>();
типа такого

andretshurotshka?❄️кде
02.10.2017
12:57:25
?????

Дмитрий
02.10.2017
12:58:00
В плане, как? ? Не оч понял

andretshurotshka?❄️кде
02.10.2017
12:58:05

Дмитрий
02.10.2017
12:58:05
Я через интерфейс определял

Google

kana
02.10.2017
12:58:47
не в этом дело, нужно, чтобы одна и та же переменная nil имена разный тип в зависимости от использования
cons(1, nil) // nil: Nil<number>
cons("q", nil) // nil: Nil<string>

Дмитрий
02.10.2017
12:59:26
Аа, ну тут уже сложнее
Но вообще это контрвариант

andretshurotshka?❄️кде
02.10.2017
12:59:34
тайпкласс ?)

Дмитрий
02.10.2017
12:59:37
Не

andretshurotshka?❄️кде
02.10.2017
12:59:40
ааа

Дмитрий
02.10.2017
12:59:54
Сложнее в том плане что вчерашний код по ряду причин не оч к этому готов
Но вообще
class Nil<-T>{ }

kana
02.10.2017
13:00:20
const nil = new Nil();
const cons = <T>(head: T, tail: List<T>): Cons<T> => new Cons(head, tail);
все немного изменилось

Дмитрий
02.10.2017
13:00:44
Минус — контрвариант, то есть тип, определяемый только на запись (что нам и нужно)
При этом лучше не экономить и каждый Nil создавать через new по месту использования

Denis
02.10.2017
13:03:31

Дмитрий
02.10.2017
13:04:04

Denis
02.10.2017
13:04:25
в скале весело с +/- играться)

Дмитрий
02.10.2017
13:04:44
Да, в флоу так же можно угорать, вовсю используютс

分解物質
02.10.2017
13:05:14

Дмитрий
02.10.2017
13:05:23
У меня типизация многих либ, и чужих и своих основана именно на этих ограниченниях

Kelin
02.10.2017
13:05:55

andretshurotshka?❄️кде
02.10.2017
13:07:15

分解物質
02.10.2017
13:09:08

Google

Kelin
02.10.2017
13:09:22
Че вы тут мутите вообще
С нилами
С консами

Denis
02.10.2017
13:09:51

Дмитрий
02.10.2017
13:10:01
Если мутишь — мути тихо

Kelin
02.10.2017
13:10:12

andretshurotshka?❄️кде
02.10.2017
13:10:14
он тардис для списков пилит
на жс

Kelin
02.10.2017
13:10:36
Ясно

Дмитрий
02.10.2017
13:10:55

Denis
02.10.2017
13:10:55
тардис основан на RState

kana
02.10.2017
13:11:05
короч, есть класс List, у него два ребенка - Nil и Cons. Я сделал if (x instanceof Nil) return. Может ли flow понять, что после этого ифа у нас однозначно Cons?

Дмитрий
02.10.2017
13:11:13
Да
Если это не противоречит твоему типу

kana
02.10.2017
13:12:01
const toArray = <T>(arr: List<T>): T[] => {
if (arr instanceof Nil) {
return [];
}
return [
$(arr.head),
...toArray(arr.tail)
];
}

Дмитрий
02.10.2017
13:12:08
Я например сначала объявил, что функция принимает List а потом сделал type inference для Nil
И флооу такой
— ЭЭэ

kana
02.10.2017
13:12:14
property 'head'. Property not found in List

Дмитрий
02.10.2017
13:12:47
Ну вот да, про это противоречие я и написал, у тебя должен быть либо интерфейс какой-то, либо ещё что
Нельзя вывести тип который противоречит декларации
По которой в List есть head

kana
02.10.2017
13:13:11
Cons<T> | Nil<T> сойдет?)

Google

Дмитрий
02.10.2017
13:13:32
Я поэтому и сказал, что код не готов, довольно нетривиальный перечень проблем появляется)
Либо прямо в параметре, либо через дженерик
<T, L: Cons<T> | Nil<T>>

kana
02.10.2017
13:27:34
ну вот https://gist.github.com/kana-sama/d4520b97b7b64ea0e5f95b6bb3df43e8
убрал всю ненужную лень для перформанса
и типы добавил
мне вообще дико не нравится писать типы прямо в коде, вместо того, чтобы описать их повыше

Дмитрий
02.10.2017
13:29:31
Я их пишу обычно в другом файле
index.h.js
У всех обмбит с этого, но мне нрм))
https://github.com/zerobias/telegram-mtproto/blob/feature/mtproto3/packages/telegram-mtproto/src/state/index.h.js
Типа вот так
Удобно, без циклических зависимостей, ну и так далее

kana
02.10.2017
13:32:07
annot x : number;
const x = 1;
Синтаксис говно такой, но идея понятна

andretshurotshka?❄️кде
02.10.2017
13:34:52
type meme = (a: { is: 'Meme' }) => { _: 'ok' }
const meme: meme = (a) => {
return { _: 'ok' }
}
meme(1)
только так)

Дмитрий
02.10.2017
13:35:21
В флоу нельзя тип и переменную с одним именем

kana
02.10.2017
13:35:42
говно

andretshurotshka?❄️кде
02.10.2017
13:35:59
только оно не работает все равно

Дмитрий
02.10.2017
13:36:16
Ну в контексте жс это хорошо, иначе поехать можно

Google

andretshurotshka?❄️кде
02.10.2017
13:36:23

Дмитрий
02.10.2017
13:36:30
\0 \0

kana
02.10.2017
13:36:33
ахахахахх

Дмитрий
02.10.2017
13:37:38

kana
02.10.2017
13:37:53
для функций мне бы это

Дмитрий
02.10.2017
13:38:09
Нужно пояснять только дженерики и прочие затруднительные места, остальное должно выводиться самостоятельно

andretshurotshka?❄️кде
02.10.2017
13:39:28
в тс так можно
function meme(a: string): void
function meme(a) {
}
в флоу не уверен

kana
02.10.2017
13:56:22
ну вот небольшой бенчмарк
lazy: 995.10693359375ms
strict: 157.68798828125ms
разница невелика, можно пользоваться)
вообще сложно сравнить с учетом того, что во втором случае предполагается ленивая работа с массивом, а в первом энергичная

adam
02.10.2017
15:16:31

Дмитрий
02.10.2017
15:19:54
Я про этот коммент выше писал

adam
02.10.2017
15:20:49
жаль, что я не умею читать

Дмитрий
02.10.2017
15:21:33
Ну сильно выше) Про то что автор не вывез оптимизацию