Ilya
IO -- это монада IO -- это функтор IO -- это конструктор типа Петя -- человек Петя -- хаскеллист Петя -- спамер
Aliester
человек не является понятием человека
Cheese
поэтому IO является монадой, но не является Monad
Евгений
нет. везде существительное
И тогда где тут тайпкласс? Тайпкласс это свойство же
A64m
С этим к Евгению, он-то утверждает, что монада - это свойство, а поэтому являться монадой ничего не может
"свойства" могут, но отношения подтипирования между "свойствами" и "объектами" в хаскеле нет, у них кайнды разные
Cheese
IO is a monad, but not the Monad
Aliester
каждый хаскелист - человек, но не каждый человек хаскелист
A64m
да нет, это тут не при чем
Ilya
IO is a monad, but not the Monad
"IO -- монада", но не "IO -- это монада"
Ilya
Вот так наверное
A64m
есть "монада IO", которая не тип, одноименная конструктору типов IO, который не монада сам по себе, но часть монады вместе с парой функций
A64m
когда говорят "f тут монада" это сокращение для более корректной формулировки, это не утверждение, что f ЯВЛЯЕТСЯ монадой
A64m
есть языки (с баундед полиморфизмом) где обсуждаемая интуиция правильна, но хаскель не из этих языков
Cheese
давайте вместо "является" говорить "is-a" или "is-the". kak eto budet po-russki?
Ilya
нет разницы
Есть иногда. Например "Петя — врач", всё нормально, но если скажешь "Петя — это врач", то это будет уже не по-русски, как будто даёшь определение Пети через врача.
A64m
да какая разница, как это будет по русски, как это в хаскеле будет вот в C# легко доказать, что T это C C foo<T>(T t) where T : C => (C)t теперь докажите, что в хаскеле t это C C t => t -> C t; foo = ???
A64m
давайте вместо "является" говорить "is-a" или "is-the". kak eto budet po-russki?
в хаскеле отношения is-a между классом и типом для которого он имлпементирован нет, нельзя их кастить
Vladimir
возможно какой-нибудь Maybe будет более чётким примером для тезиса "монада — это конструктор типов и две операции"
Vladimir
для Maybe можно определить не одну монаду, а штук пять разных
Vladimir
да и даже просто список, на нём вроде тоже не одну монаду определить можно
Cheese
нет, нельзя
Exist доказывает, что можно
A64m
нет, не доказывает
A64m
вот для сишарпа я доказал в одну строчку, вот и вы попробуйте докажите свои утверждения
A64m
тем временем решение о том, чтоб не ломать зиллион пакетов с дженериками в 8.6 проходит "рулевой" процесс, пока что на гитхабе.
A64m
ну в том и дело, что переведенное на хаскель утверждение f это Functor абсурдно, его нельзя сформулировать, кайнды не сходятся, по сравнению с языком где так и есть и все работает
Ю ли я? 🤔
Ага, типы не налазят!
A64m
я плохо знаю сишарп. что здесь написано? в частности, как определено С? что именно это доказывает?
написано что параметр типа T ограничен констрейнтом C, но мы не просто можем использовать методы C для работы с T, мы можем скастить T к C т.е. это язык в котором полиморфизм ограничивается тем, с чем есть отношение подтипирования. хаскель не такой язык, там полиморфизм ограничивается не супертипом
Ilya
Завтра в breaking news "Выяснилось, что IO — это не монада. Хаскелисты присматриваются к си-шарп"
Mary
я плохо знаю сишарп. что здесь написано? в частности, как определено С? что именно это доказывает?
там написано что в генерике т обязательно наследуется от ц. это своего рода ограничение
Cheese
по-моему, тайпклассами можно покрыть и ограничение, накладываемое супертипом, и многое другое
Cheese
это не то
почему?
A64m
потому что C это не Exists C
Cheese
A64m
для начала в кайндах
Cheese
потому что C это не Exists C
можно сказать, что в сишарпе передача по ссылке на интерфейс, а не объекта интерфейса, так что с одной стороны будет Ref C можно переименовать Exists в Ref, тогда с другой стороны будет тоже Ref C
Cheese
для начала в кайндах
чтобы говорить о кайндах, сначала покажите мне тайпклассы в Сишарпе и подтипы в Хаскеле
Cheese
нельзя сравнивать кайнды между языками
A64m
я сравниваю кайнды Constraint и Type в одном языке
Cheese
я сравниваю возможности, они примерно одинаковые
Cheese
ссылка на интерфейс — тоже тип
A64m
если сравнивать возможности, то у хаскеля они намного больше, речь не про возможности, а про то является ли ограничение тем, что оно ограничивает
Cheese
если философствовать, то роза является только розой
A64m
Exists C :: Type
правильно, а C :: Type -> Constraint
Cheese
а если писать код, то можно работать с T, обращаясь к нему только по констрэйнту
Cheese
правильно, а C :: Type -> Constraint
это ничему не противоречит
A64m
если философствовать, то роза является только розой
философствуете вы, я говорю о том, эквивалентность чего можно или нельзя доказать в языке
A64m
это ничему не противоречит
это значит что вы не сконструируете доказательство C :~: Exists C на чем разговор можно закончить
A64m
т.е. вы не утверждаете, что C это то Exists C?
Cheese
я утверждаю, что для программиста между C и Exists C нет принципиальной разницы
Cheese
наверное, можно даже написать изоморфизм
A64m
я утверждаю, что для программиста между C и Exists C нет принципиальной разницы
для какого-то программиста, может и не будет, но можно всяких программстов найти, которые между много чем разницы не увидят
Cheese
про ссылку вообще не понятно
какая часть непонятна?
A64m
да никакая, если честно
кана
а что сказать про нульарные констрейты (ну в смысле без привызяки к типам вообще)?
A64m
что?
Cheese
это значит что вы не сконструируете доказательство C :~: Exists C на чем разговор можно закончить
{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module Exists where import Data.Type.Equality data Exists c where Exists :: c a => a -> Exists c class (To a ~ b, From b ~ a) => Iso (a :: ka) (b :: kb) where type To a :: kb type From b :: ka instance Iso c (Exists c) where type To c = Exists c type From (Exists c) = c
A64m
и дальше что?
Cheese
и дальше что?
это вы хотели формального доказательства
Cheese
а я всего лишь утверждал, что можно решать одинаковые задачи
A64m
каста что-то все не видно
Cheese
суть в том, что каст не нужен в Хаскелле