【问题标题】:Implementing Cont Applicative instance实现 Cont Applicative 实例
【发布时间】:2018-12-29 04:22:27
【问题描述】:

在为Cont 实现 Applicative 实例时出现以下错误。

无法将预期类型“r”与实际类型“Cont r b”匹配,“r”是 由 ... 绑定的刚性类型变量

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 定义(&lt;*&gt;),从左侧cps 值中提取f,然后在右侧cps 值上提取fmap f。我不确定我在哪里犯了错误。

【问题讨论】:

  • 您知道&lt;*&gt; 不会将其结果包装在Cont 中吗?

标签: haskell continuation-passing


【解决方案1】:

很明显cps_f (\f -&gt; fmap f cont_cps_a)的表达式类型无效。自从

fmap f cont_cps_a :: Cont r b

\f -> fmap f cont_cps_a :: (a->b)->Cont r b

cps_f :: ((a->b)->r)->r

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

除了使用fmap,您仍然可以实现&lt;*&gt; 运算符,类似于您的fmap 函数

(Cont cps_f) <*> Cont cps_a = Cont $ \cps_b -> cps_f (\f -> cps_a (cps_b . f))

【讨论】:

  • f 是从哪里来的? Cps_b 是下一个计算,但我不知道它来自哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多