Как скрестить ужа и ежа или статическую и утиные типизации
От: FR  
Дата: 17.01.07 08:02
Оценка: 44 (6)
Привет всем.

Гвидо ван Россум, главный разработчик питона хочет ввести опциональную статическую типизацию в python 3.0:

http://www.artima.com/weblogs/viewpost.jsp?thread=85551
http://www.artima.com/weblogs/viewpost.jsp?thread=86641

Мне показались очень интересными некторые его рассуждения, вскрывающие и некторые недостатки статической типизации.
Re: Как скрестить ужа и ежа или статическую и утиные типизац
От: FR  
Дата: 17.01.07 12:41
Оценка: 1 (1)
Уточню интересно то, что он разделяет понятие типа и понятие класса. Это насколько я понимаю похоже на хаскелевские полиморфные типы, но отличается от них. Обычно в ООП языках понятие тип и класс эквивалентны (с небольшими вариациями вроде встроенных типов) здесь же предлагается новое понятие тип под которым понимается:

a "type" is an abstract set of method signatures

то есть тип это просто соответствие сигнатур методов класса определенному интерфейсу, утиная типизация остается нас ни кто ни обязывает наследоватся от этого интерфейса, но при этом вводится контроль от очень мягкого до жесткого статического.
На практике это дает к примеру такое, можно вводить обобщенные (и притом утиные) функции работающие только с определеными сущностями, например
def min(a: iterable(T)) -> T:
    .....
Re[2]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 12:50
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>то есть тип это просто соответствие сигнатур методов класса определенному интерфейсу, утиная типизация остается нас ни кто ни обязывает наследоватся от этого интерфейса, но при этом вводится контроль от очень мягкого до жесткого статического.

Т.е. класс есть набор типов чтоли? Или тип один и жёстко задан? Тогда чем от класса отличается? "Не паблик" подробностями?
Не понимаю до конца идеи
Re[3]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 13:11
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, FR, Вы писали:


FR>>то есть тип это просто соответствие сигнатур методов класса определенному интерфейсу, утиная типизация остается нас ни кто ни обязывает наследоватся от этого интерфейса, но при этом вводится контроль от очень мягкого до жесткого статического.

К>Т.е. класс есть набор типов чтоли? Или тип один и жёстко задан? Тогда чем от класса отличается? "Не паблик" подробностями?
К>Не понимаю до конца идеи

Нет класс как был так и остается.
А тип абстактное понятие, важное только например при объявлении функции. Мы можем объявить функцию принимающую определенный интерфейс, так вот любой класс у которого есть все функции с сигнатурой соответствующей этому интерфейсу будет принят, иначе отвергнут (в момент компиляции или runtime исключение). В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.
Re[4]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 13:14
Оценка:
FR> В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.

Да еще вот это совокупность классов соответствующих даному интерфейсу и есть тип. То есть понятие абстрактное и расширяемое.
Re[4]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 13:16
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


К>>Здравствуйте, FR, Вы писали:


FR>>>то есть тип это просто соответствие сигнатур методов класса определенному интерфейсу, утиная типизация остается нас ни кто ни обязывает наследоватся от этого интерфейса, но при этом вводится контроль от очень мягкого до жесткого статического.

К>>Т.е. класс есть набор типов чтоли? Или тип один и жёстко задан? Тогда чем от класса отличается? "Не паблик" подробностями?
К>>Не понимаю до конца идеи

FR>Нет класс как был так и остается.

FR>А тип абстактное понятие, важное только например при объявлении функции. Мы можем объявить функцию принимающую определенный интерфейс, так вот любой класс у которого есть все функции с сигнатурой соответствующей этому интерфейсу будет принят, иначе отвергнут (в момент компиляции или runtime исключение). В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.

Т.е. получается, что если у нас в фунции для параметра вызываются методы метод1 и мелод2, то получаем, что интерфейс параметра должен их включать?
И при проверке идёт не определение на то, что интерфейс состоит из 2 методово, а то что они есть?
Тогда понятней, спасиб
Re[2]: Как скрестить ужа и ежа или статическую и утиные типи
От: Cyberax Марс  
Дата: 17.01.07 13:16
Оценка: +2
FR wrote:
> На практике это дает к примеру такое, можно вводить обобщенные (и притом
> утиные) функции работающие только с определеными сущностями, например
> def min(a: iterable(T)) -> T:
> .....
Мне это больше всего напоминает концепты из следующего C++.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[5]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 13:21
Оценка:
Здравствуйте, FR, Вы писали:


FR>> В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.


FR>Да еще вот это совокупность классов соответствующих даному интерфейсу и есть тип. То есть понятие абстрактное и расширяемое.


Вот тут я уже запутался.
Тип — это совокупность методов опр. объекта? Или параметра метода/функции?
Просто 1-е может быть больше чем 2-е. Т.е. получаем разные типы? Но тип объекта должен быть наследником(не знаю как это сказать, но содержать больше методов, кроме тех что есть у предка) типа, который определён для параметра функции, куда этот объект передаётся, так?
Re[5]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 13:24
Оценка:
Здравствуйте, Курилка, Вы писали:


К>Т.е. получается, что если у нас в фунции для параметра вызываются методы метод1 и мелод2, то получаем, что интерфейс параметра должен их включать?

К>И при проверке идёт не определение на то, что интерфейс состоит из 2 методово, а то что они есть?
К>Тогда понятней, спасиб

В общем да. Та же утиная типизация но с ограничениями.
Re[6]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 13:27
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, FR, Вы писали:



FR>>> В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.


FR>>Да еще вот это совокупность классов соответствующих даному интерфейсу и есть тип. То есть понятие абстрактное и расширяемое.


К>Вот тут я уже запутался.

К>Тип — это совокупность методов опр. объекта? Или параметра метода/функции?
К>Просто 1-е может быть больше чем 2-е. Т.е. получаем разные типы? Но тип объекта должен быть наследником(не знаю как это сказать, но содержать больше методов, кроме тех что есть у предка) типа, который определён для параметра функции, куда этот объект передаётся, так?

Не забывай про утиную типизацию, нас не волнует что может быть больше пусть будет, главное чтобы в классе было все что есть в интерфейсе.
Re[7]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 13:30
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


К>>Здравствуйте, FR, Вы писали:



FR>>>> В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.


FR>>>Да еще вот это совокупность классов соответствующих даному интерфейсу и есть тип. То есть понятие абстрактное и расширяемое.


К>>Вот тут я уже запутался.

К>>Тип — это совокупность методов опр. объекта? Или параметра метода/функции?
К>>Просто 1-е может быть больше чем 2-е. Т.е. получаем разные типы? Но тип объекта должен быть наследником(не знаю как это сказать, но содержать больше методов, кроме тех что есть у предка) типа, который определён для параметра функции, куда этот объект передаётся, так?

FR>Не забывай про утиную типизацию, нас не волнует что может быть больше пусть будет, главное чтобы в классе было все что есть в интерфейсе.


И чем это противоречит тому, что я сказал? Забыл, наверное, "наследником" в кавычки взять, т.к. типы не есть классы, там множественное "наследование" будет вполне нормальным и т.п. А про суть отношения, которое я "наследованием" обозвал я написал
Re[4]: Как скрестить ужа и ежа или статическую и утиные типи
От: WolfHound  
Дата: 17.01.07 13:53
Оценка:
Здравствуйте, FR, Вы писали:

FR>Нет класс как был так и остается.

FR>А тип абстактное понятие, важное только например при объявлении функции. Мы можем объявить функцию принимающую определенный интерфейс, так вот любой класс у которого есть все функции с сигнатурой соответствующей этому интерфейсу будет принят, иначе отвергнут (в момент компиляции или runtime исключение). В отличии от статических языков при этом утиная типизация остается в силе, класс не обязан наследоватся от данного интерфейса, нужно только чтобы он ему соответствовал.
Вот только создатели OCaml'а и Haskell'я этого не знают...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 14:04
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Вот только создатели OCaml'а и Haskell'я этого не знают...


Внешне немного похоже, но совсем не то.
Re[6]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 14:11
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, WolfHound, Вы писали:


WH>>Вот только создатели OCaml'а и Haskell'я этого не знают...


FR>Внешне немного похоже, но совсем не то.


Поясни, в чём принципиальная разница?
Re[7]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 14:45
Оценка: -2
Здравствуйте, Курилка, Вы писали:


К>Поясни, в чём принципиальная разница?


В том что в отличии от окамла например сохраняется присущая динамике гибкость, к примеру можно реализовать функцию принимающую или строку или файл:

def read(f: file | str) -> str:
    "read data from a file"


То есть это шире чем объектные классы окамла. Те же интерфейсы у ван Россума включают не только сигнатуры методов но и тела, что позволяет в интерфейсе прописывать и Design By Contract и вообще более жесткие ограничения.
Re[3]: Как скрестить ужа и ежа или статическую и утиные типи
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.01.07 14:53
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>FR wrote:

>> На практике это дает к примеру такое, можно вводить обобщенные (и притом
>> утиные) функции работающие только с определеными сущностями, например
>> def min(a: iterable(T)) -> T:
>> .....
C>Мне это больше всего напоминает концепты из следующего C++.

А мне это напоминает существующую Скалу. Особенно вот этот пример:
def min(a: T, b: T) -> T:
    if a < b:
        return a
    else:
        return b

и дальнейшие сомнения:

What about min(1, 2.5)? That ought to be valid and return a float. I guess this means that there should be some kind of typing hierarchy that explains how the various numeric types are embedded in each other. The VM already knows about these coercion rules, but the trick is to build them into the type system. I think I would like to do this using a mechanism separate from inheritance, since I really don't think that it is a good idea to require that int is a subclass of float and float a subclass of complex. But the mechanism should also be open to user-defined types; there shouldn't be mechanisms in Python that the user cannot extend (not many, anyway).


В Скале накрутили нехилую иерархию типов, в которой есть общий корень scala.Any (все наследники от него) и общий крайний scala.Nothing (который является наследником от всех). И для того, чтобы параметризованные методы могли работать с родственными типами там понапридумывали разных ко- и контра-вариантностей, ограничений на типы параметров сверху и снизу... В общем, лично у меня в голове не укладывается

Как бы в следующем Питоне не получить чего-нибудь подобного.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 15:12
Оценка:
Здравствуйте, eao197, Вы писали:

E>В Скале накрутили нехилую иерархию типов, в которой есть общий корень scala.Any (все наследники от него) и общий крайний scala.Nothing (который является наследником от всех). И для того, чтобы параметризованные методы могли работать с родственными типами там понапридумывали разных ко- и контра-вариантностей, ограничений на типы параметров сверху и снизу... В общем, лично у меня в голове не укладывается


E>Как бы в следующем Питоне не получить чего-нибудь подобного.


А что тебя в этом пугает? Наоборот всё логично.
И вариантности там в тему вполне.
Re[8]: Как скрестить ужа и ежа или статическую и утиные типи
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 15:22
Оценка:
Здравствуйте, FR, Вы писали:

FR>То есть это шире чем объектные классы окамла. Те же интерфейсы у ван Россума включают не только сигнатуры методов но и тела, что позволяет в интерфейсе прописывать и Design By Contract и вообще более жесткие ограничения.


Поясни выделенное, плиз
В контракте будет конкретная реализация чтоли?
Re[9]: Как скрестить ужа и ежа или статическую и утиные типи
От: FR  
Дата: 17.01.07 15:33
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, FR, Вы писали:


FR>>То есть это шире чем объектные классы окамла. Те же интерфейсы у ван Россума включают не только сигнатуры методов но и тела, что позволяет в интерфейсе прописывать и Design By Contract и вообще более жесткие ограничения.


К>Поясни выделенное, плиз

К>В контракте будет конкретная реализация чтоли?

Вот пример из статьи:

interface I1:
    def fumble(name: str, count: int) -> bool:
        """docstring"""
        assert count > 0
        assert name in ReferenceTable


При реализации метода интерфейса в классе, тело метода из интерфейса будет вызыватся как предусловие.
Re[10]: Как скрестить ужа и ежа или статическую и утиные тип
От: Курилка Россия http://kirya.narod.ru/
Дата: 17.01.07 15:46
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


К>>Здравствуйте, FR, Вы писали:


FR>>>То есть это шире чем объектные классы окамла. Те же интерфейсы у ван Россума включают не только сигнатуры методов но и тела, что позволяет в интерфейсе прописывать и Design By Contract и вообще более жесткие ограничения.


К>>Поясни выделенное, плиз

К>>В контракте будет конкретная реализация чтоли?

FR>Вот пример из статьи:


FR>
FR>interface I1:
FR>    def fumble(name: str, count: int) -> bool:
FR>        """docstring"""
FR>        assert count > 0
FR>        assert name in ReferenceTable
FR>


FR>При реализации метода интерфейса в классе, тело метода из интерфейса будет вызыватся как предусловие.


Т.е. идеи Мейера, но с несколько другой (более гибкой) системой чтипизации?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.