Ilya
IO -- это монада
IO -- это функтор
IO -- это конструктор типа
Петя -- человек
Петя -- хаскеллист
Петя -- спамер
Aliester
человек не является понятием человека
Cheese
поэтому IO является монадой, но не является Monad
Cheese
Cheese
IO is a monad, but not the Monad
A64m
Aliester
каждый хаскелист - человек, но не каждый человек хаскелист
A64m
да нет, это тут не при чем
Ilya
Вот так наверное
A64m
есть "монада IO", которая не тип, одноименная конструктору типов IO, который не монада сам по себе, но часть монады вместе с парой функций
A64m
когда говорят "f тут монада" это сокращение для более корректной формулировки, это не утверждение, что f ЯВЛЯЕТСЯ монадой
A64m
есть языки (с баундед полиморфизмом) где обсуждаемая интуиция правильна, но хаскель не из этих языков
Cheese
Cheese
Cheese
давайте вместо "является" говорить "is-a" или "is-the". kak eto budet po-russki?
Ilya
нет разницы
Есть иногда. Например "Петя — врач", всё нормально, но если скажешь "Петя — это врач", то это будет уже не по-русски, как будто даёшь определение Пети через врача.
Ilya
A64m
да какая разница, как это будет по русски, как это в хаскеле будет
вот в C# легко доказать, что T это C
C foo<T>(T t) where T : C => (C)t
теперь докажите, что в хаскеле t это C
C t => t -> C t; foo = ???
A64m
Cheese
Vladimir
возможно какой-нибудь Maybe будет более чётким примером для тезиса "монада — это конструктор типов и две операции"
Vladimir
для Maybe можно определить не одну монаду, а штук пять разных
Vladimir
да и даже просто список, на нём вроде тоже не одну монаду определить можно
Cheese
Cheese
Cheese
A64m
A64m
нет, не доказывает
A64m
вот для сишарпа я доказал в одну строчку, вот и вы попробуйте докажите свои утверждения
A64m
тем временем решение о том, чтоб не ломать зиллион пакетов с дженериками в 8.6 проходит "рулевой" процесс, пока что на гитхабе.
Ilya
A64m
ну в том и дело, что переведенное на хаскель утверждение f это Functor абсурдно, его нельзя сформулировать, кайнды не сходятся, по сравнению с языком где так и есть и все работает
Ilya
Ю ли я? 🤔
Ага, типы не налазят!
Cheese
Dmitry
Ilya
Завтра в breaking news "Выяснилось, что IO — это не монада. Хаскелисты присматриваются к си-шарп"
Cheese
Mary
Cheese
по-моему, тайпклассами можно покрыть и ограничение, накладываемое супертипом, и многое другое
A64m
Cheese
A64m
потому что C это не Exists C
Cheese
A64m
для начала в кайндах
Cheese
потому что C это не Exists C
можно сказать, что в сишарпе передача по ссылке на интерфейс, а не объекта интерфейса, так что с одной стороны будет Ref C
можно переименовать Exists в Ref, тогда с другой стороны будет тоже Ref C
Cheese
для начала в кайндах
чтобы говорить о кайндах, сначала покажите мне тайпклассы в Сишарпе и подтипы в Хаскеле
Cheese
нельзя сравнивать кайнды между языками
A64m
я сравниваю кайнды Constraint и Type в одном языке
Cheese
я сравниваю возможности, они примерно одинаковые
Cheese
Cheese
ссылка на интерфейс — тоже тип
A64m
если сравнивать возможности, то у хаскеля они намного больше, речь не про возможности, а про то является ли ограничение тем, что оно ограничивает
Cheese
если философствовать, то роза является только розой
Cheese
а если писать код, то можно работать с T, обращаясь к нему только по констрэйнту
Cheese
Cheese
A64m
т.е. вы не утверждаете, что C это то Exists C?
Cheese
я утверждаю, что для программиста между C и Exists C нет принципиальной разницы
A64m
Cheese
наверное, можно даже написать изоморфизм
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
а я всего лишь утверждал, что можно решать одинаковые задачи
A64m
каста что-то все не видно
Cheese
суть в том, что каст не нужен в Хаскелле