首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell,简单延拓

Haskell,简单延拓
EN

Stack Overflow用户
提问于 2014-12-06 06:16:22
回答 1查看 145关注 0票数 2

我很难转换一个简单的CPS函数。

这是一个CPS样式的平方函数。

代码语言:javascript
复制
-- 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

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

代码语言:javascript
复制
square_cps' :: ((Int -> r) -> r) -> Int
square_cps' = ?

这不可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-06 07:02:43

首先,对square_cps定义的一个小更正

代码语言:javascript
复制
square_cps :: Int -> ((Int -> r) -> r)
square_cps x = \cont -> cont (square x)
          ^^^

或者你也可以写:

代码语言:javascript
复制
square_cps x cont = cont (square x)

请注意,即使类型签名使square_cps看起来像一个参数的函数,这也是可行的。

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

要将参数翻转到square_cps,首先编写这个等效的类型签名:

代码语言:javascript
复制
square_cps :: Int -> (Int -> r) -> r
              ^      ^             ^--- result
              |       \--- second arg
              \--- first arg

并确定如下所示的参数。然后交换第一个和第二个参数将得到以下签名:

代码语言:javascript
复制
square_cps' :: (Int -> r) -> Int -> r
square_cps' cont x = square_cps x cont

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27328928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档