Alexander
вообще OVERLAPPABLE + {-# OVERLAPPING #-}
Alexander
с некоторой долей олегинга можно наверное сказать
Alexander
доп параметр дать + фундеп
Alexander
Alexander
Alexander
@vlastachu ^
Alex
Здравствуйте
Alex
Пытаюсь разобраться с сервантом
Alex
Подскажите пожалуйста
Alex
Что означают вот эти две строки
Alex
api :: Proxy Api api = Proxy
Зигохистоморфный
тайп левел магию)
кана
api :: Proxy Api api = Proxy
data Proxy (a :: k) = Proxy тут Proxy-тип - конструктор типа с фантомным аргументом-типом любого каинда по сути своей api - просто Proxy-значение с типом-фантомом Api нужен для того, чтобы на термлевеле контролировать передачу чего-то на тайплевел (в данном случае Api) idP :: Proxy a -> a -> a idP Proxy x = x x :: _ -- will be Int x = idP (Proxy :: Proxy Int) 1 stringProxy :: Proxy String stringProxy = Proxy y :: _ -- String y = idP stringProxy "123" z = idP stringProxy 1 -- type error, String /= Int (or no Num String)
кана
простой пример использования (на самом деле можно заменить на TypeApplications)
Anton
А это случайно не Geometric Numerical Integration?
Alex
А что такое каинд?
Зигохистоморфный
А что такое каинд?
тип типа, а вооще есть чатик для начинающих
Alex
Вроде же писали что сюда можно задавать подобные вопросы
Anton
забавно через столько лет встретить снова в хаскель чате )
Alexander
тип типа, а вооще есть чатик для начинающих
НЕТУ ЧАТИКА ДЛЯ НАЧИНАЮЩИХ!!!!1 азаза
кана
ЕСТЬ @haskell_learn
Alexander
забавно через столько лет встретить снова в хаскель чате )
забавно, у меня со времён универа лежит, классная книга, жалею что лишь слегка осилил
Alexander
ЕСТЬ @haskell_learn
хватит пиарить вредные вещи
кана
что за кибербуллинг чатов
Denis
вообще смешно как-то работает
Denis
тут всех гонят в один
Alexander
@al_bl https://wiki.haskell.org/Kind
Denis
а там всех гонят в другой
Denis
мол, эта тема не для начинающих
Alexander
@al_bl если после прочтения будут вопросы, то можно попытаться по русски объяснить:)
Alexander
я уже писал почему я считаю разделение чятиков очень вредной вещью
Alexander
уже один gitter так поломали
Denis
сепаратисты
кана
А что такое каинд?
вот есть у нас терм 2, он имеет тип Int эта же логика переносится на уровень выше: есть у нас тип Int, он имеет каинд Type есть у нас терм-функция succ, которая принимает терм типа Int и отдает терм типа Int, то есть succ :: Int -> Int succ 2 :: Int эта же логика переносится на уровень выше: если конструкттор типа Maybe, который принимает тип каинда Type и отдает тип каинда Type, то есть Maybe :: Type -> Type Maybe Int :: Type есть функция $, которая принимает функцию типа (a -> b) и значение типа a, отдает значение типа b ($) :: (a -> b) -> a -> b f $ x = f x succ $ 2 == 3 есть тип $, который принимает конструктор типов (Type -> Type) и тип Type и отдает тип Type ($) :: (Type -> Type) -> Type -> Type type f $ x = f x Maybe $ Int == Maybe Int 1 :: Int :: Type не все типы имеют каинд Type или (Type -> k), где k - один из этих двух
Cheese
уже один gitter так поломали
гиттер поломало существование телеграма (и несуществование [точнее, жалкое существование] мобильного гиттера). а с сепарацией всё ок
Alexander
нет конечно
Alexander
чатик разделился на мертвый, blah и тот где говорят про коалгебры
Alexander
даже до появления этого
Alexander
мне конечно пытались много раз сказать, в чем бонус отдельного чятика, но я так и не понял
Alex
Спасибо большое
Alex
С каиндами понятно
кана
class X a where f :: a -> Int newtype Z = Z Int instance X Z where f (Z x) = x instance X a => X (a, b) where f (x, _) = f x instance X b => X (a, b) where f (_, y) = f y x = f (0, (0, (Z 1, (0, 0)))) -- ожидаю 1 Duplicate instance declarations: instance X a => X (a, b) instance X b => X (a, b) вот тот пример, overlaps мне не помог никак почему не работает - понимаю, как решить задачу - нет
Alexander
ну в конекст же не смотрит компилятор
Alexander
X (a,b) == X (a,b)
Зигохистоморфный
можно через ~
Зигохистоморфный
в контексте
кана
вот текущее рабочее рашение, но тут дублирование кода шаблона Z newtype Z = Z Int class X a where f :: a -> Int instance X Z where f (Z x) = x instance X (Z, b) where f (a, _) = f a instance {-# OVERLAPS #-} X b => X (a, b) where f (_, y) = f y x = f (0, (0, (Z 1, (0, 0))))
Alexander
эм..
Alexander
нужно же {-# OVERLAPABLE #-} X b и {-# OVERLAPS #-} X (Z,b)
Alex
Я понял что такое прокси
Alex
Но я не понимаю
Alex
Зачем его использовать
Alex
Час ушел
Alexander
например у тебя есть код вида show . read
Alexander
хотя нет, прокси просто элемент чтобы тип можно было передавать вместе с термом
Alexander
без type applciations
Anatolii
а ViewPatterns и lambda case можно как-то совместить в одно?
Зигохистоморфный
Anatolii
Спасибо, я уже не помню что я писал что оно у меня не работало :)
Alexander
@kana_sama equality я ещё вижу как вытащить, но не произвольный констрейнт
Alexander
получилось!
Alexander
{-# LANGUAGE KindSignatures #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} import Data.Proxy class X a where f :: a -> Int newtype Z = Z Int instance X Z where f (Z x) = x data T = L | R type family IF t a b :: k where IF 'True a b = a IF 'False a b = b type family When t a :: k where When 'True a = a type family Or a b where Or 'True a = 'True Or a 'True = 'True type family XQ a where XQ Z = True XQ (a,b) = Or (XQ a) (XQ b) XQ c = False type family XQW z :: T where XQW (a, b) = IF (XQ a) 'L (When (XQ b) 'R) instance (z ~ (a,b), XX (XQW z) a b) => X (a,b) where f (a,b) = ff (Proxy @ (XQW (a, b))) a b class XX (t :: T) a b where ff :: proxy t -> a -> b -> Int instance X a => XX 'L a b where ff _ a _ = f a instance X b => XX 'R a b where ff _ _ b = f b x = f (0::Int, (0::Int, (Z 1, (0::Int, 0::Int))))
Alexander
но это ужас хтонический
Alexander
@kana_sama ^
Alexander
получается констреинты дублируются через семейства, для того, чтобы было понятно какую ветку выбирать
Alexander
и соотвественно выбирается ветка через вспомогательный класс
Alexander
там у нас уже есть выбор т.к. мы вводим доп параметр, под направление
Alexander
семейства должны быть написаны так, чтобы инстанс в этой ветке у нас был
Alexander
как-то это через FD должно быть можно записать в т.ч. (наверное)
Alexander
но чот я давно олеггирингом не занимался
кана
Спасибо
кана
а что, Nat из GHC.TypeLits нельзя матчить (чтобы S k забрать например)?
кана
+ 1 использовать нельзя, он не *ективный
Alexander
нельзя, он же не индуктивный
кана
а к своим типам сахарок для литералов на тайплевеле нельзя прикрутить, верно?
Alexander
чтобы они работали как литс вроде нет