tag:blogger.com,1999:blog-32757902.post1437197822731622598..comments2023-08-04T06:48:25.106+03:00Comments on Как сломать мозг за 21 день.: Типы: Top и Bottomlrrrhttp://www.blogger.com/profile/12742106367384624657noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-32757902.post-29369376631969297572007-08-20T19:04:00.000+04:002007-08-20T19:04:00.000+04:00В Окамле тип [>] является подтипом всех остальных ...В Окамле тип [>] является подтипом всех остальных полиморфных вариантов - т.е. это своеобразный bottom.Unknownhttps://www.blogger.com/profile/12646910389871722935noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-57432099516109238552007-08-20T18:24:00.000+04:002007-08-20T18:24:00.000+04:00Ну и ещё в полуофициальной спецификации closures д...Ну и ещё в полуофициальной спецификации closures для Java тоже есть подтип всех типов — null.<BR/><BR/>http://www.javac.info/closures-v05.html<BR/><BR/>Не помню, что в двух других спецификациях.Stepan Koltsovhttps://www.blogger.com/profile/10486237398155393850noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-86707874211995724642007-08-20T18:06:00.000+04:002007-08-20T18:06:00.000+04:00Vladimir Frolov> Да, проще говоря -- в C++ "по тех...<B>Vladimir Frolov></B> Да, проще говоря -- в C++ "по техническим причинам" нету Top-типа Object, т.к. в C++ объекты очень любят храниться на стеке а не в хипе (в отличие от C#).lrrrhttps://www.blogger.com/profile/12742106367384624657noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-35545695131691617832007-08-20T18:02:00.000+04:002007-08-20T18:02:00.000+04:00migmit> Кстати, насчет полиморфных типов -- вот в ...<B>migmit></B> Кстати, насчет полиморфных типов -- вот в книжке Пирса "Types and Programming Languages" предлагается полиморфный тип (forall a.a) как замена bottom, который тоже не содержит ни одного значения (в хаскеле -- одно undefined).lrrrhttps://www.blogger.com/profile/12742106367384624657noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-50065077434993326842007-08-20T17:44:00.000+04:002007-08-20T17:44:00.000+04:00Ну, в Хаскеле полиморфных значений до фига. Скажем...Ну, в Хаскеле полиморфных значений до фига. Скажем,<BR/>Prelude> :t undefined<BR/>undefined :: a<BR/>Prelude> :t 1<BR/>1 :: (Num t) => t<BR/>Prelude> :t 1.5<BR/>1.5 :: (Fractional t) => tmigmithttps://www.blogger.com/profile/06981055611018991476noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-50284585933280987862007-08-20T17:14:00.000+04:002007-08-20T17:14:00.000+04:00В случае 1 - да. Дизайн языка С++ такой, что void*...В случае 1 - да. Дизайн языка С++ такой, что void* как Top тип разумно иметь только для указателей.<BR/><BR/>MyClass obj;<BR/>T v = obj; - В С++ это уже совершенно другой тип преобразования. Этот тип преобразования не полиморфный. Поэтому и запрещён в случае если T = void.<BR/><BR/>В случае 2 - в разных языках придумывают значения типа таких NaN (not a number, есть в JavaScript), Undefined, Infinite, NegativeInfinite. В этих случаях тот-же NaN или Infinite может вести себя как заменитель null для встроенных типов т.е. как объект типа Bottom. Правда я не знаю как это должно выглядеть в статически типизированных языках. В JavaScript типизация отсудствует.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-32757902.post-68098038566189157422007-08-20T17:05:00.000+04:002007-08-20T17:05:00.000+04:00migmit> Да, и правда. Хотя похож. Неспроста (undef...<B>migmit></B> Да, и правда. Хотя похож. Неспроста (undefined :: Int) компилятор нормально кушает.. <BR/><BR/>В процессе гугления оказалось что вроде как в предшественнике haskell -- языке Miranda был bottom. Жалко документации по нему нормальной пока не нашлось.<BR/><BR/><B>Stepan></B>Спасибо, Scala мне всегда нравилась ;)lrrrhttps://www.blogger.com/profile/12742106367384624657noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-23592800086477110182007-08-20T16:53:00.000+04:002007-08-20T16:53:00.000+04:00В смысле, где типы вроде int и float можно было бы...В смысле, где типы вроде int и float можно было бы неявно к null привести.lrrrhttps://www.blogger.com/profile/12742106367384624657noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-60390231521652908152007-08-20T16:52:00.000+04:002007-08-20T16:52:00.000+04:00Vladimir Frolov> Насчет (1), не совсем получается,...<B>Vladimir Frolov></B> Насчет (1), не совсем получается, т.к. (void *) он супертип только для указателей. Впрочем, в java, кажется, тоже нельзя int привести к java.lang.object, в отличие от C# (поправьте меня кто-нибудь).<BR/><BR/>Насчет (2) это не совсем то, обычно ссылки рассматриваются как вариантный тип с двумя конструкторами Ref a = Ptr a | Null. Я не знаю языков [со статической типизацией] где в данном случае функция может вернуть null.lrrrhttps://www.blogger.com/profile/12742106367384624657noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-44925931476713798732007-08-20T16:34:00.000+04:002007-08-20T16:34:00.000+04:00В Scala есть Nothing.В Scala есть Nothing.Stepan Koltsovhttps://www.blogger.com/profile/10486237398155393850noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-11366135619097088172007-08-20T15:30:00.000+04:002007-08-20T15:30:00.000+04:00undefined - не тип, а значение. Полиморфное значен...undefined - не тип, а значение. Полиморфное значение, относящееся к любому типу. Отдельного ТИПА undefined нет.migmithttps://www.blogger.com/profile/06981055611018991476noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-37070284037002901662007-08-20T15:14:00.000+04:002007-08-20T15:14:00.000+04:00Небольшие поправки:1. В С++ тоже есть тип Top. Это...Небольшие поправки:<BR/><BR/>1. В С++ тоже есть тип Top. Это void*. В С++ к void* может быть приведён указатель на любой тип, как инегральный, так и определённый пользователем.<BR/><BR/>2. В большинстве ООП языков нет самого типа Bottom, зато есть экземпляр этого типа - это null. В вашем примере функция может возвращать null и это не будет иметь отношения к эксепшинам.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-32757902.post-15827653343654975772007-08-20T13:54:00.000+04:002007-08-20T13:54:00.000+04:00Которого? Top или Bottom ? Bottom есть, называется...Которого? Top или Bottom ? <BR/><BR/>Bottom есть, называется undefined:<BR/>Prelude> :t 1 + undefined<BR/>1+ undefined :: (Num t) => t<BR/>Prelude> 1+ undefined<BR/>*** Exception: Prelude.undefinedlrrrhttps://www.blogger.com/profile/12742106367384624657noreply@blogger.comtag:blogger.com,1999:blog-32757902.post-2914962534225640442007-08-20T13:50:00.000+04:002007-08-20T13:50:00.000+04:00В Haskell его тоже нет. Есть abstract data types, ...В Haskell его тоже нет. Есть abstract data types, но они не подтипы таких типов как Int, Float etc.migmithttps://www.blogger.com/profile/06981055611018991476noreply@blogger.com