作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为 ContT 的正确类型应该是
newtype ContT m a = ContT {runContT :: forall r. (a -> m r) -> m r}
shift :: Monad m => (forall r. (a -> ContT m r) -> ContT m r) -> ContT m a
reset :: Monad m => ContT m a -> ContT m a
callCC :: ((a -> (forall r. ContT m r)) -> ContT m a) -> ContT m a
callCC
类型检查,不知道怎么做。
shift
和
reset
类型检查
reset :: Monad m => ContT m a -> ContT m a
reset e = ContT $ \ k -> runContT e return >>= k
shift :: Monad m => (forall r. (a -> ContT m r) -> ContT m r) -> ContT m a
shift e = ContT $ \ (k :: a -> m r) ->
runContT ((e $ \ v -> ContT $ \c -> k v >>= c) :: ContT m r) return
shift
和
reset
在这样的递归跳跃中?
newtype H r m = H (H r m -> ContT m r)
unH (H x) = x
test = flip runContT return $ reset $ do
jump <- shift (\f -> f (H f))
lift . print $ "hello"
unH jump jump
最佳答案
你愿意play a game ?
今天,你成为 callCC
.
callCC :: ((a -> (forall r. ContT m r)) -> ContT m a) -> ContT m a
-- you are here ^^
callCC :: ((a -> (forall r. ContT m r)) -> ContT m a) -> ContT m a
-- this is your opponent ^^
callCC :: forall a. ((a -> (forall b. Cont b)) -> Cont a) -> Cont a
forall a. ...
这样的类型总数是。如果你用这样的类型产生一些东西,你是说你可以为任何类型提供一个值
a
任何。如果您收到具有此类类型的内容,则可以选择要使用的特定类型。将其与
A -> ...
之类的类型进行比较对于单态函数;生成这样的函数表示您知道如何为
A
类型的任何值提供结果。 , 而接收这样的函数让你选择一个特定的值
A
使用。这似乎与
forall
的情况相同,实际上平行成立。所以,我们可以对待
forall
表示您或您的对手可以使用类型而不是术语的移动。为了反射(reflect)这一点,我将滥用符号并写成
forall a. ...
如
a =>
;然后我们可以像
(->)
一样对待它除了它必须出现在被绑定(bind)的类型变量的任何使用的左侧。
Cont a
类型的值来完成的事情。正在申请
runCont
到它。所以我们会提前这样做,并将所有相关的量词直接嵌入到
callCC
的类型中。 .
callCC :: a => ( (a -> (b => (r1 => (b -> r1) -> r1)))
-> (r2 => (a -> r2) -> r2)
) -> (r3 => (a -> r3) -> r3)
forall
就像其他函数箭头一样,我们可以重新排序并删除多余的括号以整理一些东西。特别要注意的是
callCC
事实证明,这实际上并不是游戏的结束;我们必须提供一个函数,这相当于提供另一个游戏,我们再次扮演最右边箭头的角色。所以我们可以通过合并这些来节省一步。我还将向左 float 类型参数,以将它们全部放在一处。
callCC :: a => r3 => (a -> r3)
-> (r2 => (b => r1 => a -> (b -> r1) -> r1) -> (a -> r2) -> r2)
-> r3
r3
类型的东西.我们的对手已经采取了四次行动,我们已将其作为参数接收。一招就是选择
r3
,所以我们已经处于劣势了。另一个举动是
a -> r3
,这意味着如果我们可以玩一个
a
,我们的对手会吐出
r3
我们可以滑向胜利。不幸的是,我们的对手也打了
a
,所以我们又回到了起点。我们要么需要
a
类型的东西,或其他方式来获得
r3
类型的东西.
r2 => (b => r1 => a -> (b -> r1) -> r1) -> (a -> r2) -> r2
r2
类型的东西,其中
r2
是我们可以玩的东西。很明显,我们需要播放
r3
或
a
取得任何进展。
a
:如果我们玩
a
如
r2
,那么我们就可以玩
id
如
a -> r2
.另一个 Action 更复杂,所以我们会跳进去。
b => r1 => a -> (b -> r1) -> r1
r1
类型的东西,其中
r1
是对手的举动。他们还发挥了作用
b -> r1
,其中类型
b
也是他们的举动。所以我们需要任何一种类型的东西
b
或
r1
从他们。不幸的是,他们给我们的只是
a
类型的东西。 ,让我们处于无法取胜的境地。猜猜玩
a
早些时候是一个糟糕的选择。让我们再试一次...
r3
:如果我们玩
r3
如
r2
,我们还需要发挥一个功能
a -> r3
;好在对方已经发挥了这样的功能,所以我们可以简单地使用它。我们再次跳入另一个 Action :
b => r1 => a -> (b -> r1) -> r1
r1
不要求它们提供一种构建方法让我们陷入困境。
r1
:
r1
为例。我们的对手在内部游戏中玩,然后将其拉出并返回以将其玩为
r2
.
r2 => (b => r1 => a -> (b -> r1) -> r1) -> (a -> r2) -> r2
(b => a -> (b -> r1) -> r1) -> (a -> r1) -> r1
r1
还是被对手选中。因此,我们在这里所做的只是洗牌;显然,我们甚至无法希望获得
a
或
r3
因此,我们又走到了另一个死胡同。
b
:
b
由对手在最里面的游戏中玩,然后循环播放作为
r2
.现在对手的 Action 是这样的:
(r1 => a -> (b -> r1) -> r1) -> (a -> b) -> b
r1 => a -> (b -> r1) -> r1
b
上面的结果也是如此,给函数
b -> r1
, 收到
r1
我们需要。成功!
a -> b
类型的游戏.没有明显的方法可以找到,但我们已经有了
b
躺着,所以我们可以使用
const
在那丢弃
a
和 -
b
类型的值在哪里?首先来自哪里?暂时把自己放在对手的位置上,他们唯一能得到的地方是我们采取的行动的结果。如果只有
b
我们拥有的是他们给我们的,我们最终会兜兜转转;游戏永远不会结束。
callCC
的游戏中,我们唯一的策略要么导致亏损,要么导致永久僵局。
callCC :: forall a. ((a -> (forall b . Cont b)) -> Cont a) -> Cont a
callCC = error "A strange game..."
关于haskell - 如何让 callCC 更有活力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7178919/
我正在尝试构建一个看起来有点像 this 的模式使用适用于 iOS 和 Android 的 React Native。有没有做模糊/活力叠加的库?我看了一下 react-native-blur ,但不
我是一名优秀的程序员,十分优秀!