使用RankNTypes的这个仿函数的名称是什么?

vie*_*rcc 11 haskell functor higher-rank-types

在围绕目标包玩游戏时,我注意到以下类型有趣的属性.

> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
Run Code Online (Sandbox Code Playgroud)

它是一个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)
Run Code Online (Sandbox Code Playgroud)

经过几个小时的google/hoogle,我放弃了找到包含此类型的任何现有模块. 这是什么类型的?如果众所周知,这个名字是什么?这有用还是被忽略因为没用?

这不是我100%的原始创作,因为N是从Objective包中找到的Object派生的.

> data Object f g = Object {
>     runObject :: forall x. f x -> g (x, Object f g)
>   }
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

N将Store comonad转换为State monad,但inverse不为true.

> 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)  -- ???
Run Code Online (Sandbox Code Playgroud)

N不能拿Maybe.

N Maybe r
 = forall x. Maybe x -> (x, r)
 = forall x. (() -> (x, r), x -> (x, r))
 = Void     -- because (() -> (x, r)) can't be implemented
Run Code Online (Sandbox Code Playgroud)

以下功能可能很有趣.我无法做到这一点.

> 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'
Run Code Online (Sandbox Code Playgroud)

整篇文章都是有文化的Haskell(.lhs).

小智 2

我称其为“处理程序”函子。Object在我发布目标之前,曾经使用处理函数来定义。

是的,这个函子很有趣——Cofree (Handler f)有一个公共 getter 并且Free (Handler f)是一个凡人对象。也许我应该发送处理程序函子......