Во время игры около objective package, я заметил, что следующий тип имеет интересное свойство.Как называется этот функтор, который использует RankNTypes?
> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
Это Functor.
> instance Functor (N f) where
> fmap f (N nat) = N $ fmap (fmap f) nat
> -- or, = N $ \fx -> let { (x,a) = nat fx } in (x, f a)
Через несколько часов Google/hoogle, я отказался найти любой существующий модуль, который включает в себя этот тип. Что это за тип? Если известно, какое имя? Это полезно или игнорируется, потому что бесполезно?
Это не мое 100% оригинальное творение, потому что N было получено из объекта, найденного в объективном пакете.
> data Object f g = Object {
> runObject :: forall x. f x -> g (x, Object f g)
> }
N f
является функтором, который дает Object f Identity
, когда Фикс применяется.
Следующий факт об этом типе и почему я думал, что это интересно.
N конвертирует считыватель в Writer, наоборот. (Здесь я) символ (= для изоморфизма между типами)
N ((->) e) r
= forall x. (e -> x) -> (x, r)
= (e, r)
N ((,) d) r
= forall x. (d, x) -> (x, r)
= d -> r
N преобразует магазин комонадой в государственный монады, но обратное не верно.
> data Store s a = Store s (s -> a)
> type State s a = s -> (s, a)
N (Store s) r
= forall x. (s, (s -> x)) -> (x, r)
= forall x. s -> (s -> x) -> (x, r)
= s -> (s, r)
= State s r
N (State s) r
= forall x. (s -> (s, x)) -> (x, r)
= forall x. (s -> s, s -> x) -> (x, r)
= forall x. (s -> s) -> (s -> x) -> (x, r)
= (s -> s) -> (s, r) -- ???
N не может принять Возможно.
N Maybe r
= forall x. Maybe x -> (x, r)
= forall x. (() -> (x, r), x -> (x, r))
= Void -- because (() -> (x, r)) can't be implemented
Следующая функция может быть интересной. Я не мог сделать это наоборот.
> data Cofree f a = Cofree a (f (Cofree f a))
> data Free f a = Pure a | Wrap (f (Free f a))
> unfree :: Free (N f) r -> N (Cofree f) r
> unfree (Pure r) = N $ \(Cofree a _) -> (a, r)
> unfree (Wrap n_f) = N $
> \(Cofree _ f) -> let (cofree', free') = unN n_f f
> in unN (unfree free') cofree'
Весь пост является грамотным Haskell (.lhs).
я не знаю имя, но записать его как '(ForAll х FX -.> ((,) Г) х)' и становится чем-то, что может быть передан в 'Control.Comonad.Cofree. hoistFree'. – Gurkenglas
@chi В 'N' нет' g'. Он устанавливает 'g ~ Identity' в' Object f g'. Если вы отбросите неинтересную «Идентификацию» от 'forall x. f x -> Identity (x, Object f Identity) 'вы получаете' forall x. f x -> (x, Object f) '. Если вы замените рекурсивное появление 'Object f' новым параметром' r', вы получите 'forall x. f x -> (x, r) ', что является' N f r'. 'Fix (N f)' помещает рекурсивное вхождение обратно туда, где был 'r'. – Cirdec
Это выглядит как ['Ran'] (https://hackage.haskell.org/package/profunctors/docs/Data-Profunctor-Ran.html#t:Ran), но смешивает и сопоставляет профинансы и бифунторы. 'forall x. f x -> x' - это индекс в 'f'. Другая часть - читатель из среды «forall x». f x', считая структуру 'f', но не ее значения. – Cirdec