我有这种类型,基本上是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。
答案 0 :(得分:8)
答案 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}}实例。