objectiveパッケージの遊びの間、私は次のタイプが面白い特性を持っていることに気付きました。RankNTypesを使用するこのファンクタの名前は何ですか?
> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
これはFunctorです。グーグル/ hoogleの数時間後
> 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)
、私はこのタイプを含む任意の 既存のモジュールを見つけることあきらめました。 このタイプは何ですか?よく知られている場合、名前は何ですか?役に立たなかったり無視したりしていますか?
Nは目的のパッケージに含まれるオブジェクトから派生したもので、これは私の100%オリジナルの作成ではありません。
> data Object f g = Object {
> runObject :: forall x. f x -> g (x, Object f g)
> }
N f
修正が適用されたときにObject f Identity
を生成ファンクタです。
このタイプについての事実は、私がそれが面白いと思った理由です。
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ストアはStateモナドにcomonad変換しますが、逆は真ではありません。
> 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)です。
私はそのための名前を知らないが、 'としてそれを書く(X forallをFX - 。>((、)R)x)'は、それは 'Control.Comonad.Cofreeに渡すことができるものとなります。ホイストフリー。 – Gurkenglas
@chi「N」には「g」はありません。これは 'Object f g'に' g〜Identity'を設定しています。あなたが 'forall xから興味のない' Identity's'をドロップすると、 f x - >アイデンティティ(x、オブジェクトfアイデンティティ) 'あなたは' 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'の構造体を読み込みますが、その値は読みません。 – Cirdec