Durante il gioco del pacchetto objective, ho notato che il seguente tipo ha proprietà interessanti.Qual è il nome di questo functor che utilizza RankNTypes?
> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
È un 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)
Dopo poche ore di google/Hoogle, ho rinunciato a trovare alcuna modulo esistente che include questo tipo. Che cos'è questo tipo? Se è noto, come si chiama? È utile o ignorato perché inutile?
Questa non è la mia creazione originale al 100%, poiché N derivava da Oggetto trovato nel pacchetto obiettivo.
> data Object f g = Object {
> runObject :: forall x. f x -> g (x, Object f g)
> }
N f
è un Functor che produce Object f Identity
quando Fix viene applicato.
Di seguito è riportato un fatto su questo tipo e perché ho pensato che fosse interessante.
N converte il Reader in Writer, viceversa. (Qui ho usato() = simbolo per isomorfismo tra i tipi)
N ((->) e) r
= forall x. (e -> x) -> (x, r)
= (e, r)
N ((,) d) r
= forall x. (d, x) -> (x, r)
= d -> r
N converte Conservare comonad alla monade Stato, ma inversa non è vero.
> 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 non può prendere Forse.
N Maybe r
= forall x. Maybe x -> (x, r)
= forall x. (() -> (x, r), x -> (x, r))
= Void -- because (() -> (x, r)) can't be implemented
La seguente funzione potrebbe essere divertente. Non potrei farlo è inverso.
> 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'
intero post è alfabetizzata Haskell (.lhs).
so nessun nome per questo, ma lo scrivo come '(forall x fx -.> ((,) R) x)' e diventa qualcosa che può essere passato a 'Control.Comonad.Cofree. hoistFree'. – Gurkenglas
@chi Non c'è 'g' in' N'. Sta impostando 'g ~ Identity' in' Object f g'. Se si rilascia il 'Identity's' poco interessante da 'forall x. f x -> Identità (x, Object f Identity) 'si ottiene' per tutto x. f x -> (x, Object f) '. Se si sostituisce l'occorrenza ricorsiva di 'Object f' con un nuovo parametro' r' si ottiene 'forall x. f x -> (x, r) ', che è' N f r'. 'Correggi (N f)' riporta l'occorrenza ricorsiva nel punto in cui 'r' era. – Cirdec
Questo sembra ['Ran'] (https://hackage.haskell.org/package/profunctors/docs/Data-Profunctor-Ran.html#t:Ran), ma mescolando e abbinando i profunctors ei bifunctors. 'per tutto x. f x -> x' è un indice in 'f'. L'altra parte è un lettore dall'ambiente di 'forall x. f x', leggendo la struttura di 'f' ma non i suoi valori. – Cirdec