Big Bux Chungus
можно для Nat попросить type Obj (~>) f = Functor f
кана
хм, ну да, это все таки ограниченная категория объектов, а не ограничения на функтор
кана
я пытался ставить ограничения на конструтор ~>, но они конечно не вытягивались в функторе
кана
{-# LANGUAGE RankNTypes , TypeOperators , MultiParamTypeClasses , TypeInType , TypeFamilies , UndecidableInstances , StandaloneDeriving , FlexibleContexts , ConstraintKinds #-} import Prelude hiding (Functor, map) import Data.Kind import Data.Function (fix) class Category (cat :: k -> k -> Type) where type Object cat (a :: k) :: Constraint cat_id :: Object cat a => a `cat` a cat_compose :: (Object cat a, Object cat b, Object cat c) => b `cat` c -> a `cat` b -> a `cat` c instance Category (->) where type Object (->) a = () cat_id = id cat_compose = (.) instance Category (~>) where type Object (~>) f = Functor (->) (->) f 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 map :: (Object cat1 a, Object cat1 b, Object cat2 (f a), Object cat2 (f b)) => (a `cat1` b) -> (f a `cat2` f b) instance Functor (->) (->) Maybe where map = fmap instance Functor (->) (->) [] where map = fmap instance Functor (~>) (->) Fix where map eta = fix (\f -> Fix . runNat eta . map f . unFix) newtype (f :: Type -> Type) ~> (g :: Type -> Type) = 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) type HaskFunctor = Functor (->) (->) hoist :: (HaskFunctor f, HaskFunctor g) => (forall x. f x -> g x) -> Fix f -> Fix g hoist f = map (Nat f) toList :: Maybe a -> [a] toList (Just x) = [x] toList Nothing = [] x :: Fix Maybe x = Fix (Just (Fix (Just (Fix Nothing)))) y, z :: Fix [] y = hoist toList x z = map (Nat toList) x
кана
намного лучше
Зигохистоморфный
{-# LANGUAGE RankNTypes , TypeOperators , MultiParamTypeClasses , TypeInType , TypeFamilies , UndecidableInstances , StandaloneDeriving , FlexibleContexts , ConstraintKinds #-} import Prelude hiding (Functor, map) import Data.Kind import Data.Function (fix) class Category (cat :: k -> k -> Type) where type Object cat (a :: k) :: Constraint cat_id :: Object cat a => a `cat` a cat_compose :: (Object cat a, Object cat b, Object cat c) => b `cat` c -> a `cat` b -> a `cat` c instance Category (->) where type Object (->) a = () cat_id = id cat_compose = (.) instance Category (~>) where type Object (~>) f = Functor (->) (->) f 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 map :: (Object cat1 a, Object cat1 b, Object cat2 (f a), Object cat2 (f b)) => (a `cat1` b) -> (f a `cat2` f b) instance Functor (->) (->) Maybe where map = fmap instance Functor (->) (->) [] where map = fmap instance Functor (~>) (->) Fix where map eta = fix (\f -> Fix . runNat eta . map f . unFix) newtype (f :: Type -> Type) ~> (g :: Type -> Type) = 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) type HaskFunctor = Functor (->) (->) hoist :: (HaskFunctor f, HaskFunctor g) => (forall x. f x -> g x) -> Fix f -> Fix g hoist f = map (Nat f) toList :: Maybe a -> [a] toList (Just x) = [x] toList Nothing = [] x :: Fix Maybe x = Fix (Just (Fix (Just (Fix Nothing)))) y, z :: Fix [] y = hoist toList x z = map (Nat toList) x
такс, чем это отличается от предидущего?
кана
нет констрейтов в Functor
кана
они вынесены в более правильное место - в категорию (~>) - категория конкретно эндофункторов в Hask, а не всех типоконструкторов, из-за этого больше не нужны констрейты в функторе
Big Bux Chungus
я ща экспериментирую с data Dict (c :: Constraint) where Dict :: c => Dict c class (Category cat1, Category cat2) => Functor (cat1 :: k1 -> k1 -> *) (cat2 :: k2 -> k2 -> *) (f :: k1 -> k2) where obj :: forall a. Obj cat1 a => Dict (Obj cat2 (f a)) map :: (Obj cat1 a, Obj cat1 b) => (a `cat1` b) -> (f a `cat2` f b)
кана
Big Bux Chungus
у меня GHC старый
Big Bux Chungus
хм, ну да, это все таки ограниченная категория объектов, а не ограничения на функтор
теоретически можно ещё попробовать написать категорию функторов
Зигохистоморфный
да, это категория всех типов
ну и соответственно для естественных преобразований, это категория всех функторов
Big Bux Chungus
и может быть категорию всех категорий используя Dict
кана
Big Bux Chungus
да, а можно "The category with categories as objects and functors as arrows." ?
Big Bux Chungus
class (Category cat1, Category cat2) => Functor (cat1 :: k1 -> k1 -> *) (cat2 :: k2 -> k2 -> *) (f :: k1 -> k2) where obj :: forall a. Obj cat1 a => Dict (Obj cat2 (f a)) map :: (Obj cat1 a, Obj cat1 b) => (a `cat1` b) -> (f a `cat2` f b) instance Functor (->) (->) Maybe where obj = Dict map = fmap instance Functor (->) (->) [] where obj = Dict map = fmap newtype Fix f = Fix { unFix :: f (Fix f) } deriving instance Show (f (Fix f)) => Show (Fix f) instance Functor (~>) (->) Fix where obj = Dict map eta = fix (\f -> Fix . runNat eta . map f . unFix)
Зигохистоморфный
@kana_sama ты смотрел Коналовское решение? https://github.com/conal/concat
Big Bux Chungus
нет ещё
Big Bux Chungus
он ща пригодится, попробую категорию категорий написать
Big Bux Chungus
всё сложно, надо думать data CatT (cat1 :: k1 -> k1 -> *) (cat2 :: k2 -> k2 -> *) = forall (f :: k1 -> k2). Functor cat1 cat2 f => CatT (Proxy f)
Denis
https://twitter.com/dshevchenko_biz/status/1043459549389352960
Denis
Простите за оффтоп, друзья, но я знаю, что здесь много Вимеров...
Ilya
@ulysses4ever ты про ICFP спрашивал? я вот приехал
Artem
@ulysses4ever ты про ICFP спрашивал? я вот приехал
Круто!А я только выезжаю :) Надо законтачиться будет
Ilya
пиши, как приедешь
21it
привет а никто не знает есть ли какая-нибудь простая в использовании библиотека для поддержки multiline strings с интерполяцией?
IC
https://hackage.haskell.org/package/interpolate ?
21it
спасибо!
Dmitrii
привет а никто не знает есть ли какая-нибудь простая в использовании библиотека для поддержки multiline strings с интерполяцией?
Смотря, что подразумевается под интерполяцией. Если самая простая для мультистрочных строк, где можно вставлять текстовые переменные, то лучше neat-interpolation: * http://hackage.haskell.org/package/neat-interpolation У interpolate, как я вижу, в зависимостях haskell-src-meta, а это значит, что зависимости будут билдиться полчаса, а если на виртуалке с 2Гб памяти, так и вовсе может не сбилдиться. Я бы порекомендовал избегать библиотек с очень тяжёлыми зависимостями, если нет острой необходимости.
21it
спасибо, NeatInterpolation - то что нужно
Maksim
Подскажите какую-нибудь (хорошую) статью/пост про перформанс серванта, как делать и как не делать. Здесь выше у кого-то проект с ним не собирался из-за того, что в память не влезал.
NC
Совет простой, не особо мудри с тайплевел фичами, я сам на грабли наступил тогда
NC
По умолчанию сервант хорошо работает, памяти хватит
NC
Я тогда на тайплевел вычислял символьные тэги для доступов авторизации для каждого эндпойнта
NC
Ещё к выжиранию памяти может привести использование vinyl в body запросов
NC
Не думаю, что в эти грабли можно попасть, не зная уже многих других не type level грабель
A64m
да и вывод инстансов аесона через дженерики
A64m
если рекорды большие
NC
Меня через ghcjs вывод аесон инстансов на TH бесит, компилит модуль с 200 инстансами минут 10
NC
но на дженериках наверное бы в рантайме боль была
A64m
да они вроде не тормозные
NC
Помню на uniplate поверх Generic были большие лаги
NC
А TH нормально справился
A64m
юниплейт-то тормозной
NC
Вместе с Generic это было очень заметно
Алексей
А можно cabal new-build воспретить пытаться что-то притащить по сети?
Алексей
Можно. --offline
Alexander
а у варпа есть возможность сказкать forkWarpProcess
Alexander
чтобы в случае graceful shutdown этот процесс бы тоже ожидался?
Big Bux Chungus
https://alexknvl.com/posts/counting-type-inhabitants.html
Oleg
https://alexknvl.com/posts/counting-type-inhabitants.html
We’ve encountered a problem proving that from . to = id Это следует из натуральности f Лемма Йонеды ставит в эквивалентность не весь ∀ x. (a -> x) -> f x, а его натуральный сабсет. Для натуральной f верно что для любой g f. fmap g == fmap g. f
Зигохистоморфный
есть просто такая ката https://www.codewars.com/kata/yoneda-lemma/haskell
Зигохистоморфный
и там как раз про инхабитантов тоже есть
Oleg
Ну как бы и получается, что счёт для полиморфных типов не совсем верен, т.к. основан на натуральности
Oleg
ага, а натуральность следует из free theorems
Натуральность сама по себе ниоткуда не следует. ∀ x. (a -> x) -> f x строго больше, чем множество естественных
Oleg
Для утверждения о множествах безотносительно хаскеля это тоже верно
Big Bux Chungus
следует из fmap id = id
Big Bux Chungus
и из free theorems
Oleg
следует из fmap id = id
Нет, конечно. Это просто закон функтора
Big Bux Chungus
ок, давай по порядку
Oleg
Давай
Big Bux Chungus
> Это следует из натуральности f
Big Bux Chungus
что конкретно имеется в виду под натуральностью f?
Oleg
forall a. f a -> g a более широкое множество, чем множество естественных трансформаций из f в g
Oleg
что конкретно имеется в виду под натуральностью f?
f - это имя полиморфной функции, которая используется в твоём доказательстве
Big Bux Chungus
это не полиморфная функция
Big Bux Chungus
это type constructor
Big Bux Chungus
ну т.е. f : Type -> Type, только если в этом смысле
Big Bux Chungus
естественные трансформации = natural transformation?
Oleg
это не полиморфная функция
from . to $ f = from $ f id = \g -> fmap g (f id) вот из твоей ссылки
Big Bux Chungus
ааа
Oleg
Это доказуемо, когда f - не любая полиморфная функция, а удовлетворяющая условию натуральности, которое я написал
Big Bux Chungus
f :: ∀ x. (a -> x) -> f x