
Aleh
14.02.2017
10:25:27
Ну тут легко решается adhoc полиморфизмом, но функции будут не в объекте.

Paul
14.02.2017
10:25:44
Это всё adhoc полиморфизм и так
И проблема, как видишь, не решается
В крестах можно первую проблему ещё как-то решить, но через жопу (определять методы в зависимости от того, если метод у типа или нет), но вторая всё равно не решается.

Google

Aleh
14.02.2017
10:26:53
function clone<T: Cloneable> (i: Iterator<T>): Iterator...
Решает вполне

Paul
14.02.2017
10:29:01
Так можно решить только для свойств самого типа, но не итератора. Скажем, если есть свойство ExactSize для итераторов, которые могут сказать, сколько элементов осталось, то какие-то производные итераторы (скажем Map) это свойство сохраняют, а какие-то (Filter) — нет.
Т.е. придётся эти все функции вот так выносить.
(где тут ООП, кстати, лол?)

Aleh
14.02.2017
10:31:23
Хз, задача к ооп как-то боком вообще)

Paul
14.02.2017
10:31:36
Эм. Т..е как это каким боком?

Aleh
14.02.2017
10:31:47
Ну это ж про систему типов

Paul
14.02.2017
10:31:52
Пример того, что даже базовые концепцие как итераторы в ООП ведут к диким костылям
К дублированию иерархий (уродливые CopyableEqOrdMap)
Ну и нифига не расширяемый подход, ибо чтобы своё свойство притащить, придётся продублировать все итераторы.
Ну это ж про систему типов
Я не знаю, что ты подразумеваешь под "ООП", но факт прост: в классовом ООП эта задача решается негибкими костылями и дублированием всего и вся.
В прототипном тоже

Google

Aleh
14.02.2017
10:35:43
Я так проще пойму
Не надо фул реализацию)

Paul
14.02.2017
10:36:36
Ну и, соб-но, потом, получив итератор, сделать it.uniq() и получить итератор по уникальным значениям, который в зависимости от итератора будет либо dedup делать, либо дорогой полноценный uniq. (диспетчеризация, разумеется, в компайлтайме)

Aleh
14.02.2017
10:40:32
А, так ты сам привел ооп пример
Тогда в чем вопрос?)
Ну вот в расте это сделали, клево)

Paul
14.02.2017
10:41:10

Aleh
14.02.2017
10:41:24
Ооп про взаимодействие объектов

Paul
14.02.2017
10:41:28
А сичтать его ооп или нет — похрену, ибо под "ооп" и так всё что угодно понимают

Aleh
14.02.2017
10:41:41
А не классы там или преобразования

Paul
14.02.2017
10:42:01

Aleh
14.02.2017
10:42:39
1. EverythingIsAnObject.
2. Objects communicate by sending and receiving messages (in terms of objects).
3. Objects have their own memory (in terms of objects).
4. Every object is an instance of a class (which must be an object).
5. The class holds the shared behavior for its instances (in the form of objects in a program list)
6. To eval a program list, control is passed to the first object and the remainder is treated as its message
Тут в идеале бы s/class/type

Paul
14.02.2017
10:45:04

Aleh
14.02.2017
10:45:34

Paul
14.02.2017
10:45:58

Google

Сергей
14.02.2017
10:46:28

Aleh
14.02.2017
10:46:33
Вполне

Paul
14.02.2017
10:46:44
Вполне
С чего вдруг примитив стал объектом?
Он не может иметь методы/принимать сообщения

Aleh
14.02.2017
10:47:06

Paul
14.02.2017
10:47:20
1. всё объект
2. но это не объект
3. это объект, потому что (1)

Aleh
14.02.2017
10:47:40

Paul
14.02.2017
10:48:05
2.+(3)
nope. Оператор в крестах это не функция, как бы ты этого не хотел
Передать его нельзя, сигнатуру не описать. + сам компилятор о нём знает

Aleh
14.02.2017
10:49:09
Это уже детали реализации

Paul
14.02.2017
10:49:22
Ну, мы же и говорим про конкретный язык
т.е. с++ не ООП язык, так?

Aleh
14.02.2017
10:49:37
Нет
Никто ж не сказал, что я через точку вызывать их должен
Или даже наследовать мочь
Этот объект мало может? Ну да, он такой вот маленький пока что, но мы можем обернуть и сделать объекты сложнее и умнее

Paul
14.02.2017
10:53:45

Google

Paul
14.02.2017
10:54:48
Ну мы же не на кофейной гуще гадаем, есть стандарт, в котором чёрным по белому написано, что есть примитивы и есть объекты.

Aleh
14.02.2017
10:54:51
Что?
Что классы должны или не должны наследоваться

Сергей
14.02.2017
10:54:52

Aleh
14.02.2017
10:55:02
Это где?

Paul
14.02.2017
10:55:16

Aleh
14.02.2017
10:55:46

Paul
14.02.2017
10:55:51
Новый тип
Унаследуй от int

Aleh
14.02.2017
10:56:08
Зачем? Оо

Admin
ERROR: S client not available

Paul
14.02.2017
10:56:40
Ладно, слушай. Алана Кея все читали
И Алан Кей не имеет никакого отношения к современному ООП
Эти принципы — это принципы акторной модели

Aleh
14.02.2017
10:57:13
В flowtype можно что-то вроде такого алиаса:
type NewInt = int & {}

Paul
14.02.2017
10:57:42

Aleh
14.02.2017
10:57:53
Кто менял?)

Сергей
14.02.2017
10:58:07

Google

Aleh
14.02.2017
10:58:13

Paul
14.02.2017
10:58:15
Не важно как называть вещи. Если все называют бублик уткой, значит теперь это утка.

Aleh
14.02.2017
10:58:39

Paul
14.02.2017
10:58:46
undefined включить в maybe тип, буэ
+ нормально не описать эвентэмиттер
ну ладно, это не по теме

Aleh
14.02.2017
11:01:07

Paul
14.02.2017
11:02:28
? О.о
Ну, нужно чтобы описание было что-то вроде:
class EventEmitter {
on('error', (Error) => void): void;
...
}
class A extends EventEmitter {
on('data', (number) => void): void;
}

Aleh
14.02.2017
11:02:37
нет
Если ты про int, то я number имел ввиду

Paul
14.02.2017
11:03:20
Даже в TS подобное сделать можно (правда придётся таки описать on(ev: string, fn: Function), но специализация заработает.

Aleh
14.02.2017
11:03:54
Разве флоу не умеет понимать строковые литералы как тип?
Или не в том проблема?
В A будет аля
class A extends EventEmitter {
on (ev: 'data'|'error')
}

Sergey
14.02.2017
11:06:01
@mkusher а ты на котлине не пишешь?)

Aleh
14.02.2017
11:06:13

Sergey
14.02.2017
11:06:20
а че? не нравится?

Aleh
14.02.2017
11:06:41
Ну, задач нет, я же сейчас в гуще фронтенда

Paul
14.02.2017
11:07:30

Aleh
14.02.2017
11:08:06
И прям новое слово в интерфейсах

Paul
14.02.2017
11:09:04