r并产生 r 类型的结果。所以延续和整个 Cont r a产生相同类型的结果 r 。 我的问题是:两个结果是否必须相同值,或者可以是 Cont-6ren">
gpt4 book ai didi

haskell - "Cont r a"能否对其延续的结果进行后处理

转载 作者:行者123 更新时间:2023-12-02 17:18:59 24 4
gpt4 key购买 nike

Cont r a type 代表一个需要延续的函数 a->r并产生 r 类型的结果。所以延续和整个 Cont r a产生相同类型的结果 r

我的问题是:两个结果是否必须相同,或者可以是 Cont r a对延续的结果进行后处理并生成不同的值,尽管类型相同 r

我尝试使用(+1)用于后处理(请注意 + 1 --<-- ):

c1 :: Int -> Cont r Int
c1 x = let y = 2*x
in cont $ \k -> (k y) + 1 --<--

现在不需要进行类型检查,因为我的后处理函数 (+1)只接受类型属于 Num 的参数类型类。但是,我传递了延续的结果 (k y)这是某种类型 r不能保证属于 Num类型类。

无论我做什么(k y) ,它必须是 r->r 类型的函数。唯一可以为所有人执行此操作的函数 rid功能和使用 id后处理根本就不是后处理。

但是,如果我限制r,整个事情就会进行类型检查。到Num typeclass 甚至具体类型 Int 。然后它会产生预期的结果:

*Main> runCont (c1 1) id
3

我很不确定,

  • 如果进行这样的后处理并限制r的类型是正常的事情,如果是的话,在什么情况下这可能有用
  • 或者如果类型变量 r对于所有 r 必须读作 并限制 r 的类型会带来各种麻烦。

有人可以解释一下吗?

最佳答案

从技术上来说,我认为没问题。将 Cont r a 专门化为 Num r => Cont r a 似乎并不比将 Reader r a 专门化为 Num r => 有更多问题读者r a

这样做的含义是,生成的 CPS 计算只能针对生成数字的(最终)延续运行,但这很明显 - 如果您有一个将延续结果后处理为数字的计算,它只能与产生数字的延续一起使用!

作为至少在某种程度上受到认可的额外证据,请注意有一个函数:

mapCont :: (r -> r) -> Cont r a -> Cont r a

如果要在不限制 r 的情况下使用此函数,则其第一个参数的唯一有效值将是 id 或不会终止的函数,如下所示你已经注意到了。

使用 mapContc1 版本可能如下所示:

c2 :: (Num r) => Int -> Cont r Int
c2 x = mapCont (+1) $ return (2*x)

并且似乎工作正常:

> runCont (c2 10) id
21
> runCont (c2 10) (const 5)
6
> runCont (c2 10) show
... No instance for (Num String) arising from a use of 'c2' ...

至于什么时候这有用,我不确定。我能想到一些有些蹩脚的应用程序。您可以定义一个覆盖最终结果的计算(假设没有使用其他类型的后处理):

override x = cont (const x)

使用方式如下:

> runCont (return 2 >>= \x -> cont (\f -> f (x*3))) id
6
> runCont (return 2 >> override 1000 >>= \x -> cont (\f -> f (x*3))) id
1000
>

或模拟编写器添加日志功能的计算转换器:

annotate note comp = mapCont (\(a, w) -> (a, note:w)) comp

你可以这样使用:

runCont (annotate "two" (return 2)
>>= \x -> annotate "times three" (cont (\f -> f (x*3))))
(\a -> (a, []))

产量:

(6,["two","times three"])

不过,这些看起来并不是非常引人注目的应用程序。

关于haskell - "Cont r a"能否对其延续的结果进行后处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159422/

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