LINUX.ORG.RU
Ответ на: комментарий от hateyoufeel

У них они там типа уже есть, но это очень неудобно. Тайпклассы вообще не должны быть отдельной сущностью, это просто дикшенари. В хаскелле с этим обосрались и в прочих идрисах закрепили обсёр. Я пишу свой язык где будет по нормальному сделано.

fulmar_lor
()
Ответ на: комментарий от fulmar_lor

Тайпклассы вообще не должны быть отдельной сущностью, это просто дикшенари.

В штонах у тебя просто дикшенари. Тайпклассы – это constraint в первую очередь.

Я пишу свой язык где будет по нормальному сделано.

Публикуй ссылку на документ с дизайном, мы посмотрим.

hateyoufeel ★★★★★
()
Ответ на: комментарий от ymn

А такие работы вообще ведутся?

Не-а. Но хочется нормальный operator overloading, а не как сейчас.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

В штонах у тебя просто дикшенари.

https://limo.libis.be/primo-explore/fulldisplay?docid=LIRIAS1656272&context=L&vid=Lirias&search_scope=Lirias&tab=default_tab&lang=en_US&fromSitemap=1

>Wadler and Blott formalise type classes in their 1989 paper using a translation to
>a standard Hindley-Milner typed functional language [46]. This translation is known
>as the dictionary translation and not only serves as an implementation strategy, but
>also gives an accurate semantic model of type classes. A type class is modelled as
>a dictionary record type, with the type class operations as record fields. Instances
>become record values containing the definitions in the instance as fields.

data Eq t = EqDict {equal :: t → t → Bool}
data Ord t = OrdDict {eqDict :: Eq t, compare :: t → t → Ordering}

Тайпклассы – это constraint в первую очередь.

Хренейнт. SomeClass a =>- это просто ещё один аргумент функции, значение которого (инстанс) должен передаваться неявно (или явно, если хочется). Новые сущности выдумывать не нужно ибо получится убогий хаскелль:

>Apart from the automatic inference of instances, the dictionary model has many
>advantages over the standard type class system. All the power of normal language
>record mechanisms is available, and they can be defined, manipulated and abstracted
>over in standard ways.

Публикуй ссылку на документ с дизайном, мы посмотрим.

В процессе разработки. Идеи пишу в этом треде

fulmar_lor
()
Последнее исправление: fulmar_lor (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

В штонах у тебя просто дикшенари. Тайпклассы – это constraint в первую очередь.

Чем принципиально вот это вот:

class Functor' f where
    fmap' :: forall a b. (a -> b) -> (f a -> f b)

foo :: Functor' f => f a -> f ()
foo f = fmap' (const ()) f

data I a = MkI a
  deriving (Show)

instance Functor' I where
    fmap' = \f (MkI a) -> MkI (f a)

ex :: I ()
ex = foo (MkI 42)

отличается от вот этого вот:

data Functor' f = MkFunctor
    { fmap' :: forall a b. (a -> b) -> (f a -> f b) }

foo :: Functor' f -> f a -> f ()
foo isF f = fmap' isF (const ()) f

data I a = MkI a
  deriving (Show)

functorI :: Functor' I
functorI = MkFunctor 
    { fmap' = \f (MkI a) -> MkI (f a) }

ex :: I ()
ex = foo functorI (MkI 42)
Laz ★★★★★
()
Ответ на: комментарий от fulmar_lor

Хренейнт. SomeClass a =>- это просто ещё один аргумент функции, значение которого (инстанс) должен передаваться неявно (или явно, если хочется).

Давай, покажи мне, где тут словарь передаётся и куда.

data Proxy x = Proxy

class Gay a

data Fulmar_Lor

instance Gay Fulmar_Lor

whoIsGay :: Gay a => proxy a -> String
whoIsGay x = "This lad is totally gay!"

main :: IO ()
main = putStrLn (whoIsGay $ Proxy @Fulmar_Lor)
hateyoufeel ★★★★★
()
Ответ на: комментарий от Laz

Ты сделал хак, чтобы использовать словарь без тайпклассов. Но тайпклассы – это далеко не только словарь. Смотри мой пример выше.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Посмотрел, получилось то же самое, только без лишних сущностей:

data Gay a = MkGay

data Fulmar_Lor

gayFulmar_Lor :: Gay Fulmar_Lor
gayFulmar_Lor = MkGay

whoIsGay :: Gay a -> String
whoIsGay x = "This lad is totally gay!"

main :: IO ()
main = putStrLn (whoIsGay gayFulmar_Lor)
Laz ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ой, какой милый великосветский баттл!

anonymous
()
Ответ на: комментарий от Laz

Окей, а теперь попробуй своим методом сделать ограничение на возвращаемое значение. Типа функции findGayUser :: Gay x => [User xs] -> Maybe (User x). Мы так, например, запилили систему прав доступа с гарантиями во время компиляции, что юзер без нужных прав не попадёт в код с доступом к соответствующим ресурсами.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel
{-# LANGUAGE TypeApplications #-}
data Proxy x = Proxy

data Gay a = GayDict

data Fulmar_Lor

gayFulmar_Lor :: Gay Fulmar_Lor
gayFulmar_Lor = GayDict

whoIsGay :: Gay a -> proxy a -> String
whoIsGay gayA x = "This lad is totally gay!"

main :: IO ()
main = putStrLn (whoIsGay gayFulmar_Lor $ Proxy @Fulmar_Lor)

ЗЫ. Ничего не имею против геев, но ты не угадал – я гетеросексуал.

fulmar_lor
()
Ответ на: комментарий от hateyoufeel

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

Laz ★★★★★
()
Ответ на: комментарий от Laz

А посмотри “Ghosts of departed proofs”. Мне с телефона не очень удобно код печатать, но там были классные примеры.

Или, как пример чуть попроще, попробуй open union (https://hackage.haskell.org/package/union) сделать без классов.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

А посмотри “Ghosts of departed proofs”.

Посмотрел. Где же и для чего там используются тайпклассы?

Ну, во-первых, там есть coerce, который встроен в хаскель и волей разработчиков языка сделан через тайпклассы. Тут, наверное, ничего особо не сделаешь.

Во-вторых:

The reflection library is an implementation of Kiselyov and Shan’s functional pearl about implicit configurations [7], allowing the user to pass values implicitly using Haskell’s typeclass machinery. We can combine reflection with GDP in order to pass proofs implicitly, so they seem to appa- rate out of thin air just when they are needed.

Тайпклассы используются для автоматического поиска инстансов и неявной передачи их в аргументы. Пользоваться GDP без тайпклассов можно, но с ними удобнее. А про «законы», «констрейнты» и прочую такую чушь ни слова.

Laz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.