Alexander
текущая версия либы никиты это все же не драйвер
Alexander
он хочет драйвер сделать, насколько я знаю
Alexander
так то есть postgresql-simple поверх postgresql-libpq
Alexander
может оно?
Alexander
@willbasky третья часть на мой взгляд разумна только специализированная
Alexander
т.е. изучение какой-то области с примерами на Haskell
Alexander
системы типов, компиляторы те же
Alexander
ML
Alexander
это в универах
Vladislav
Кто-нибудь встречал туториал по squeal кроме того, что есть в доках и на ютюбе от автора?
Alexander
стикеры на канале не работают
Cucumba
Кажется, я не планировал сюда что-то писать, сорян
Alexander
все ок
Ilya
GHC 8.6.1 вроде релизнулся? Что там интересного?:)
A64m
вроде нет еще
Ilya
я в гите видел
Ilya
http://git.haskell.org/ghc.git
A64m
а, тег поставили.
A64m
ну, значит в течении нескольких дней соберут под основные платформы и анонс напишут
A64m
а что нового тут написано https://downloads.haskell.org/~ghc/8.6.1-beta1/docs/html/users_guide/8.6.1-notes.html
A64m
языковые фичи новые - DerivingVia и QuantifiedConstraints
A64m
из неязыковых - поиск подстановок для типодырок сильно лучше чем в 8.4
A64m
ну и всякие синтаксические мелочи вроде for_ [0, 10_000 .. 100_000] \i -> print i
Alexander
:doc в этом?
A64m
а, да, доки еще
A64m
можно в гхци смотреть
A64m
еще хип-вью из коробки
A64m
больше можно плагинами делать
A64m
ну и конечно новая фича оптимизатора, оптимизирующая 1 в 3, которая попала в гхц только благодаря единственному человеку, который про нее не забыл - мне https://ghc.haskell.org/trac/ghc/ticket/9136#comment:26
Leonid 🦇
GHC now supports British spelling of GeneralizedNewtypeDeriving. Nice
Евгений
языковые фичи новые - DerivingVia и QuantifiedConstraints
Квантифаент констрейнт выглядит круто
кана
как сделать всегда верный констрейнт вида Type -> Constraint
кана
class Any a instance Any a очевидно
Dmitry
Такое же ощущение изучения сферических коней возникло
кана
type Any a = ()
тут нет типа Type -> Constraint
кана
Any x тут неделим, Any сам по себе нельзя использовать
Cheese
тут нет типа Type -> Constraint
{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE KindSignatures #-} type Any a = (() :: Constraint) λ> :k Any Any :: * -> Constraint
кана
ну не получится тут отдать Any сам по себе
Cheese
да, твой вариант class + instance лучше
кана
class X a where type C a :: Type -> Constraint instance F Int where type C Int = Any
кана
вообще немного поработав с классами с ассоциативными констрейтами, которые потом в элементах класса встречаются, могу сделать вывод, что это крайне неудобно, наверное должен быть способ лучше это делать, про который мы пока не знаем
кана
как минимум типолямбды все немного упрощают
кана
в которые нет ни одного движения, хоть вроде ghc даже форкали и писали рабочий вариант
Cheese
class X a where type C a :: Type -> Constraint instance F Int where type C Int = Any
class X a where type C a b :: Constraint instance X Int where type C Int b = ()
Cheese
(const ()) ограничение кажется лишней сущностью, когда можно взять ()
Big Bux Chungus
class Any a instance Any a class X a (c :: Type -> Constraint) | a -> c instance X Int Any
Big Bux Chungus
можно вот так
кана
это стало решающим
кана
{-# LANGUAGE RankNTypes , TypeOperators , MultiParamTypeClasses , TypeInType , TypeFamilies , UndecidableInstances , StandaloneDeriving #-} import Prelude hiding (Functor, map) import Data.Kind import Data.Function (fix) class Category cat where cat_id :: a `cat` a cat_compose :: b `cat` c -> a `cat` b -> a `cat` c instance Category (->) where cat_id = id cat_compose = (.) instance Category (~>) where cat_id = Nat id cat_compose f g = Nat (runNat f . runNat g) class (Category cat1, Category cat2) => Functor cat1 cat2 (f :: obj1 -> obj2) where type C f (a :: obj1) :: Constraint map :: C f a => (a `cat1` b) -> (f a `cat2` f b) instance Functor (->) (->) Maybe where type C Maybe a = () map = fmap instance Functor (~>) (->) Fix where type C Fix f = (Functor (->) (->) f, C f (Fix f)) map eta = fix (\f -> Fix . runNat eta . map f . unFix) newtype f ~> g = Nat { runNat :: forall x. f x -> g x } newtype Fix f = Fix { unFix :: f (Fix f) } deriving instance Show (f (Fix f)) => Show (Fix f) toList :: Maybe a -> [a] toList (Just x) = [x] toList Nothing = [] x :: Fix Maybe x = Fix (Just (Fix (Just (Fix Nothing)))) y :: Fix [] y = map (Nat toList) x
кана
наконец описал инстанс функтора для Fix
Cheese
повторяешь https://hackage.haskell.org/package/categories?
Зигохистоморфный
повторяешь https://hackage.haskell.org/package/categories?
У Кметта нет функтора для фикс, разве что это бификс, тогда функтор в стандартных тайпклассах выразим
Cheese
классы и у Кметта, и у @kana_sama свои
кана
повторяешь https://hackage.haskell.org/package/categories?
да нет, никакой цели не было и либу не видел, внезапно загорелся желанием как-то выразить в хаскеле функториальность Fix, что раньше даже не казалось мне очевидным
Зигохистоморфный
классы и у Кметта, и у @kana_sama свои
не надо мне про Кметтовские пакеты рассказывать) я знаю про них, и про внутреннее устройство
кана
но все равно сделаю вывод, что работать с ассоциативными констрейтами неудобно
Зигохистоморфный
кана
хитрый constraint в Fix
да, вот в нем и неудобство, слишком много старнный констрейтов придется требовать для обобщенного кода, который будет такое использовать
кана
видел я выше запостил через fundeps вариант?
да, но вроде он не поменяет ничего
кана
и там такое как выше не опишешь уже)
Cheese
но все равно сделаю вывод, что работать с ассоциативными констрейтами неудобно
мне кажется, в этом что-то не так. в инстансах дополнительные ограничения должны быть слева от головы
Cheese
чего это?
(просто попытка пошутить)
Зигохистоморфный
а по поводу категориальности, есть еще такой пакет https://github.com/sjoerdvisscher/data-category
кана
мне кажется, в этом что-то не так. в инстансах дополнительные ограничения должны быть слева от головы
делают ассоциативны ограничения внутри, когда нечего ограничивать в голове
кана
то есть вот тут у нас инстанс над Fix, а ограничивать нужно аргументы для Fix
Big Bux Chungus
есть ещё https://github.com/mikeizbicki/subhask
Big Bux Chungus
по-хорошему надо как-то так: class Category (cat :: k -> k -> *) where type Obj cat (a :: k) :: Constraint id :: Obj cat a => cat a a (.) :: (Obj cat a, Obj cat b, Obj cat c) => cat b c -> cat a b -> cat a c instance Category (->) where type Obj (->) a = () id = P.id (.) = (P..) newtype f ~> g = Nat { runNat :: forall x. f x -> g x } instance Category (~>) where type Obj (~>) a = () id = Nat id (.) f g = Nat (runNat f . runNat g) class (Category cat1, Category cat2, forall a. Obj cat1 a => Obj cat2 (f a)) => Functor (cat1 :: k1 -> k1 -> *) (cat2 :: k2 -> k2 -> *) (f :: k1 -> k2) where map :: (Obj cat1 a, Obj cat1 b) => (a `cat1` b) -> (f a `cat2` f b)
Big Bux Chungus
но GHC у меня слишком старый для QuantifiedContexts
Big Bux Chungus
это тебе и даст C Fix f => C f (Fix f)