gpt4 book ai didi

haskell - 这个使用 RankNTypes 的仿函数叫什么名字?

转载 作者:行者123 更新时间:2023-12-04 02:24:27 25 4
gpt4 key购买 nike

在游戏期间 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)

经过几个小时的谷歌/胡歌,我放弃了寻找任何
包含此类型的现有模块。
这是什么类型?如果它是众所周知的,它的名字是什么?这是有用的还是因为无用而被忽略?

这不是我 100% 的原创,因为 N 是从目标包中的 Object 派生的。
> 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 将 Store comonad 转换为 State monad,但 inverse 不正确。
> 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不能接受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

以下功能可能很有趣。我无法做到相反。
> 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)。

最佳答案

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

是的,这个仿函数很有趣——Cofree (Handler f)有一个公共(public) setter/getter 和 Free (Handler f)mortal object .也许我应该运送处理程序仿函数......

关于haskell - 这个使用 RankNTypes 的仿函数叫什么名字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36929014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com