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 спрашивал? я вот приехал
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
Ну как бы и получается, что счёт для полиморфных типов не совсем верен, т.к. основан на натуральности
Big Bux Chungus
Oleg
Для утверждения о множествах безотносительно хаскеля это тоже верно
Big Bux Chungus
следует из fmap id = id
Big Bux Chungus
и из free theorems
Big Bux Chungus
ок, давай по порядку
Oleg
Давай
Big Bux Chungus
> Это следует из натуральности f
Big Bux Chungus
что конкретно имеется в виду под натуральностью f?
Oleg
forall a. f a -> g a более широкое множество, чем множество естественных трансформаций из f в g
Big Bux Chungus
это не полиморфная функция
Big Bux Chungus
это type constructor
Big Bux Chungus
ну т.е. f : Type -> Type, только если в этом смысле
Big Bux Chungus
естественные трансформации = natural transformation?
Big Bux Chungus
ааа
Oleg
Это доказуемо, когда f - не любая полиморфная функция, а удовлетворяющая условию натуральности, которое я написал
Oleg
Big Bux Chungus
f :: ∀ x. (a -> x) -> f x