Applicative不用于测序

时间:2016-12-18 16:47:28

标签: haskell monads applicative do-notation

我有这种类型,基本上是Kleisli箭头:

{-# language DeriveFunctor #-}

data Plan m i o = Plan  (i -> m o) deriving Functor

instance (Monad m) => Applicative (Plan m i) where
    pure x = Plan (\_ -> pure x)
    Plan f <*> Plan x = Plan (\i -> f i <*> x i)

由于它有一个Applicative实例,我打开ApplicativeDo并尝试使用do-notation构建一个值:

{-# language ApplicativeDo #-}

myplan :: Plan IO () ()
myplan = do
    pure ()
    pure ()

不起作用:

No instance for (Monad (Plan IO ())) arising from a do statement

有没有办法让它发挥作用?我正在使用GHC 8.0.1。

2 个答案:

答案 0 :(得分:8)

GHC Trac中搜索与ApplicativeDo相关的故障单后,似乎是一个已知问题:

明确丢弃结果是一种解决方法:

do
  _ <- pure ()
  pure ()

答案 1 :(得分:1)

$ awk -v idx=1 'NR==1 || $idx>max{max=$idx} END{print max}' file 93 并不意味着ApplicativeDo表达式总是总是在应用仿函数方面被贬低,但只有在这样做时才有意义。在这里,它没有。如果您有do表达式,如

do

请注意,订单并不重要,因此您可以将其去除

do
  x <- someAction
  y <- someAction
  return (x + y)

而不是

pure (+) <*> someAction <*> someAction

然而,表达

someAction >>= (\x -> someAction >>= (\y -> return (x + y))

无法单独使用do pure () pure () pure进行表达。 not 等同于<*>,因为第一个值包含pure () <*> pure (),而不是函数。由于没有有效的方法只使用()实例来解决这个问题,因此编译器会查找并找不到允许Applicative的{​​{1}}实例。