gpt4 book ai didi

Haskell,简单延续

转载 作者:行者123 更新时间:2023-12-02 18:54:51 25 4
gpt4 key购买 nike

我很难转换简单的 CPS 函数

这是一个 CPS 风格的平方函数

-- from : http://en.wikibooks.org/wiki/Haskell/Continuation_passing_style
square :: Int -> Int
square x = x * x

square_cps :: Int -> ((Int -> r) -> r)
square_cps = \cont -> cont (square x)
-- square_cps 3 print will write '9' out in console

现在,我想以相反的顺序更改函数参数

square_cps' :: ((Int -> r) -> r) -> Int
square_cps' = ?

这不可能吗?

最佳答案

首先对 square_cps 的定义进行小幅更正:

square_cps :: Int -> ((Int -> r) -> r)
square_cps x = \cont -> cont (square x)
^^^

或者你可以写:

square_cps x cont = cont (square x)

请注意,即使类型签名使 square_cps 看起来像只有一个参数的函数,这种方法仍然有效。

现在,square_cps' 的类型签名无法工作。他们的编写方式意味着您可以从 (Int -> r) -> r 中获取 Int ,这是一个返回 r 的函数.

要将参数翻转为 square_cps,首先编写以下等效类型签名:

square_cps :: Int -> (Int -> r) -> r
^ ^ ^--- result
| \--- second arg
\--- first arg

并识别参数,如图所示。然后交换第一个和第二个参数会产生以下签名:

square_cps' :: (Int -> r) -> Int -> r
square_cps' cont x = square_cps x cont

一般来说,签名a -> b -> c相当于a -> (b -> c),即函数类型构造函数关联到对。

关于Haskell,简单延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27328928/

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