Во время воспроизведения вокруг objective пакета я заметил, что следующий тип имеет интересное свойство.
> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
Это функтор.
> 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 было получено из Object, найденного в объективном пакете.
> data Object f g = Object {
> runObject :: forall x. f x -> g (x, Object f g)
> }
N f
- это Functor, который дает Object f Identity
, когда Fix применяется к.
Ниже приведена информация об этом типе и почему я думал, что это интересно.
N конвертирует Reader в Writer, наоборот. (Здесь я использовал (=) символ для изоморфизма между типами)
N ((->) e) r
= forall x. (e -> x) -> (x, r)
= (e, r)
N ((,) d) r
= forall x. (d, x) -> (x, r)
= d -> r
N конвертирует Хранить comonad в State monad, но инверсия неверна.
> 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).