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)
这不可能吗?
首先是对您的定义的一个小修正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)
,即函数类型构造函数关联到右侧.
归档时间: |
|
查看次数: |
102 次 |
最近记录: |