首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Cont应用实例

实现Cont应用实例
EN

Stack Overflow用户
提问于 2018-12-29 04:22:27
回答 1查看 181关注 0票数 2

在为Cont实现应用程序实例时,我得到了以下错误。

无法匹配预期类型‘r’与实际类型‘Cont r’‘r’是一个严格的类型变量。

代码语言:javascript
复制
newtype Cont r a = Cont {(>>-) :: (a -> r) -> r}

instance Functor (Cont r) where
  -- fmap :: (a -> b) -> (Cont r) a -> (Cont r) b
  fmap f (Cont cps_a) = Cont $ \cps -> cps_a (cps . f)

instance Applicative (Cont r) where
  -- pure :: a -> Cont r a
  pure x = Cont ($ x)
  -- (<*>) Cont r (a -> b) -> Cont r a -> Cont r b
  (Cont cps_f) <*> cont_cps_a = cps_f (\f -> fmap f cont_cps_a)

我试图使用fmap来定义(<*>),从左cps值中提取f,然后在右cps值之上提取fmap f。我不知道我在哪里犯了这个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-29 07:23:37

显然,表达式cps_f (\f -> fmap f cont_cps_a)的类型是无效的。因为

代码语言:javascript
复制
fmap f cont_cps_a :: Cont r b

代码语言:javascript
复制
\f -> fmap f cont_cps_a :: (a->b)->Cont r b

代码语言:javascript
复制
cps_f :: ((a->b)->r)->r

cps_f需要参数类型为(a->b)->r,但现在是(a->b)->Cont r b

与使用fmap不同,您仍然可以实现类似于fmap函数的方式的<*>操作符

代码语言:javascript
复制
(Cont cps_f) <*> Cont cps_a = Cont $ \cps_b -> cps_f (\f -> cps_a (cps_b . f))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53966692

复制
相关文章

相似问题

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