JS
гринтреды в Хаскеле вообще в язык встроены, а в Питоне несколько библиотек
Size: a a a
JS
AF
KV
AF
JS
JS
DM
Data.Constraint
и увидел там занимательнный типnewtype a :- b
:k a :: Constraint
и :k b :: Constraint
:-
означает что мы имеем в скоупе констрейнт bclass (Eq a) => Ord a
Ord a :- Eq a
, зачем для пруфа этого факта нужен отдельный тип? Разве если у нас в скоупе есть Ord a
, не значит ли это что есть Eq a
?:-
для игрушечных тайпклассовclass A a where
class (A a) => B a where
instance A Int
instance B Int
proof :: B Int :- A Int
proof = ???
:-`меня смущает -- `Sub (a => Dict b)
, а именно смущает наличие толстой стрелки внутри скобокDM
к
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
data Dict a = a => Dict
newtype a :- b = Sub (a => Dict b)
class A a
class B b
instance A a => B a
a_imlpl_b :: A a :- B a
a_imlpl_b = Sub Dict
DM
DM
DM