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).
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |