Haskell,简单的延续

1am*_*bda 2 continuations haskell

我很难转换简单的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
Run Code Online (Sandbox Code Playgroud)

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

square_cps' :: ((Int -> r) -> r) -> Int
square_cps' = ?
Run Code Online (Sandbox Code Playgroud)

这不可能吗?

Eri*_*ikR 5

首先是对您的定义的一个小修正square_cps:

square_cps :: Int -> ((Int -> r) -> r)
square_cps x = \cont -> cont (square x)
          ^^^
Run Code Online (Sandbox Code Playgroud)

或者你可以写:

square_cps x cont = cont (square x)
Run Code Online (Sandbox Code Playgroud)

请注意,即使类型签名square_cps看起来只是一个参数的函数,这仍然有效.

现在,类型签名square_cps'无法正常工作.他们的方法是写它意味着你可以得到一个Int出来的(Int -> r) -> r是它返回的功能r.

要翻转参数square_cps,首先编写此等效类型签名:

square_cps :: Int -> (Int -> r) -> r
              ^      ^             ^--- result
              |       \--- second arg
              \--- first arg
Run Code Online (Sandbox Code Playgroud)

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

square_cps' :: (Int -> r) -> Int -> r
square_cps' cont x = square_cps x cont
Run Code Online (Sandbox Code Playgroud)

通常,签名a -> b -> c等效于a -> (b -> c),即函数类型构造函数关联到右侧.

  • 定义:`foo xy = x + y`时,`foo`的类型为`Int - > Int - > Int`,而不是`Int - > Int`.有关如何使用ghci打印表达式的类型,请参阅[这些答案](http://stackoverflow.com/questions/12659927/using-ghci-to-find-type). (2认同)