Хочу странного!

yroslavasako

Не видел ли кто возможно эзотерического языка, где иерархию типов можно растить не только вниз, объявляя новый сабкласс от классов, но и вверх, объявляя новый суперкласс для существующих классов? Таковой суперкласс по идее является неким union type, где методы автоматически или вручную делегируются нужному типу. Фишка в том, чтобы это делалось не вручную, а встраивалось в концепцию классов, насследования, ко/контр-вариации и позволяла бы статически проверять контракты типов. Если вместо инкапсуляции в классы будут generic methods в стиле CLOS, то это только приветствуется.

okis

Мне кажется, это можно реализовать через mixins
Только я не совсем понимаю, зачем это может быть нужно, если можно сделать обычную композицию

Maurog

может быть, я не понял вопрос, но есть такая фишка, как классы типов в хаскеле
первая ссылка из гугла: http://www.haskell.org/tutorial/classes.html

yroslavasako

Через mixins - как раз фигу.
Это моё странное возникло от наблюдения за скаловской системой акторов. Функция для посылки сообщения принимает сообщения типа Any и не может быть ограничена по типу. Возникает это по следующей причине. Пусть у нас есть специальный тип для сообщений. В скале он называется для простоты алгебраическим, но таковым не является. По факт просто объявляется один старший тип и несколько наследников-конструкторов. То, что в хаскеле делается через data type, здесь делается просто через наследование. Но допустим, мы хотим скомбайнить обработку сообщений, например, через orElse, с обработкой сообщений другого типа. Тут возникает необходимость объявить анонимный супертип для двух типов, ну или на худой конец не анонимный, но такой, который не потребует переписывать объявления исходных типов. Такой функциональности в скале нет. Там можно сделать вручную делегата и зароутить методы класса, можно даже сделать это невручную, через кодогенерацию в плагинах компилятора. Но при этом возможность статической проверки типов пропадает всё равно. И поэтому все акторы, независимо от своего назначения, принимают сообщения типа Any, и отказываются от статической типизации.
Возможно есть и другие use case, где было бы очень удобно наращивать корни у дерева классов.

yroslavasako

классы типов
в любом случае, все супертипы (и прочие зависимости) у класса прописаны в объявлении класса. И не могут потом наращиваться

Maurog

все супертипы (и прочие зависимости) у класса прописаны в объявлении класса
да вроде там чуток по-другому =\ ведь можно нацепить интерфейс на тип гораздо позже объявления типа
а мочкану-ка я еще ссылочкой: http://stackoverflow.com/questions/3124511/newbie-question-h... :grin:

yroslavasako

интерфейс на тип
но ты не можешь нацепить интерфейс на интерфейс. В смысле наследования - можешь. А вот в смысле объявления суперкласса - нет

6yrop

но ты не можешь нацепить интерфейс на интерфейс. В смысле наследования - можешь. А вот в смысле объявления суперкласса - нет
я наверное не понял о чем речь, но вот в TypeScript-е интерфейс можно определять позже класса, и класс об интерфейсе ничего не знает:
  
class Foo {
m1: string {
return "";
}
}

interface IFoo {
m1: => string;
}

window.onload = => {
var foo: IFoo = new Foo;
};

yroslavasako

это что, duck typing? Он же не позволяет производить статических проверок.

6yrop

это что, duck typing?
не совсем
Он же не позволяет производить статических проверок.

Каких проверок? Если у класса не будет метода интерфейса, то компилятор выдаст ошибку.

yroslavasako

пример. У всех интов есть метод сложения. Да ещё много у каких типов. Статическая проверка позволяет избежать сложения разных типов.
duck typing никогда не заменит иерархии типов. Если считаешь иначе - заведу отдельную ветку для разъяснения различий нормальной иерархии типов и утиной

6yrop

пока я не уверен, что то что я показал это Duck typing
In "duck typing",[13] a statement calling a method m on an object does not rely on the declared type of the object; only that the object, of whatever type, must supply an implementation of the method called, when called, at run-time.
http://en.wikipedia.org/wiki/Type_system#Duck_typing

В TypeScript наличие метода проверяется в компайл тайме.

6yrop

a statement calling a method m on an object does not rely on the declared type of the object
в TS релаются не на декларацию типа, а на шаг позже на декларацию переменной (или параметра метода).

yroslavasako

В TypeScript наличие метода проверяется в компайл тайме.
в скале тоже есть статический duck typing, но он всё равно не позволяет строить таксономию типов для выполнения дополнительных проверок. И duck typing теряется на pattern matching и полиморфизме. И в том примере, что я показал, тоже теряется.

6yrop

для выполнения дополнительных проверок
можешь в коде показать каких проверок не хватает? Просьба, в примере по минимуму использовать навороты скалы, я скалу не знаю.

SEMEN73

Не видел ли кто возможно эзотерического языка, где иерархию типов можно растить не только вниз, объявляя новый сабкласс от классов, но и вверх, объявляя новый суперкласс для существующих классов? Таковой суперкласс по идее является неким union type, где методы автоматически или вручную делегируются нужному типу.
Категории в Objective-C?
Оставить комментарий
Имя или ник:
Комментарий: