Haskell 如何使用可扩展效果和IO?

Haskell 如何使用可扩展效果和IO?,haskell,Haskell,我试图将示例从改写为包1.11.0.0的新版本,但当我尝试使用lift for IO monad时,我得到了“无法推断…”:( ghc 7.10.1 {-# LANGUAGE FlexibleContexts, ScopedTypeVariables, TypeOperators #-} {-# LANGUAGE DeriveFunctor, DeriveDataTypeable #-} module Main where import Data.Typeable import Control

我试图将示例从改写为包1.11.0.0的新版本,但当我尝试使用lift for IO monad时,我得到了“无法推断…”:(

ghc 7.10.1

{-# LANGUAGE FlexibleContexts, ScopedTypeVariables, TypeOperators #-}
{-# LANGUAGE DeriveFunctor, DeriveDataTypeable #-}
module Main where

import Data.Typeable
import Control.Eff
import Control.Eff.Lift

data Log v = Log String v deriving (Functor, Typeable)

log' :: Member Log r => String -> Eff r ()
log' txt = send . inj $ Log txt ()

verboseAddition :: Member Log r => Eff r Int
verboseAddition = do
   log' "I'm starting with 1..."
   x <- return 1

   log' "and I'm adding 2..."
   y <- return 2

   let r = x + y

   log' $ "Looks like the result is " ++ show r
   return r

runLogger :: Eff (Log :> r) a -> Eff r ([String],a)
runLogger = loop
   where 
     prefixLogWith txt (l,v) = (txt:l, v)
     loop = freeMap
       (\x -> return ([], x))
       (\u -> handleRelay u loop
              $ \(Log txt next) -> fmap (prefixLogWith txt) (loop next))

runIOLogger :: SetMember Lift (Lift IO) r => Eff (Log :> r) a -> Eff r a
runIOLogger = loop
   where
     loop = freeMap
       return
       (\u -> handleRelay u loop 
              $ \(Log txt next) -> 
                  lift (putStrLn txt)  >>  --  Could not deduce ...    :(
                  loop next)

main:: IO ()
main = --    print $ run $ runLogger verboseAddition -- ok
       runLift (runIOLogger verboseAddition) >>= print 
这项工作:

runIOLogger :: SetMember Lift (Lift IO) r => Eff (Log :> r) a -> Eff r a
runIOLogger = freeMap
  return
  (\u -> handleRelay u runIOLogger $ \(Log txt next) -> do
           lift $ putStrLn txt
           runIOLogger next)
除此之外:

runIOLogger :: SetMember Lift (Lift IO) r => Eff (Log :> r) a -> Eff r a
runIOLogger = loop
   where
     loop :: SetMember Lift (Lift IO) r => Eff (Log :> r) a -> Eff r a
     loop = freeMap
       return
       (\u -> handleRelay u loop 
              $ \(Log txt next) -> 
                  lift (putStrLn txt)  >>  --  Could not deduce ...    :(
                  loop next)
GHC多态类型用于递归绑定,相反,它首先在假设递归绑定变量为单态的情况下推断类型,然后泛化生成的类型。这意味着只有当我们使用递归绑定的不同实例化时,类型推断才会失败。例如,这无法检查:

id' a = fst (a, id' (a, a))
但这很好:

id' :: a -> a
id' a = fst (a, id' (a, a))

我很确定这就是问题所在,尽管我还没有努力找出推理到底在哪里停止。

你能写出整个错误吗?好的。我已经在帖子中包含了完整的错误信息。
id' :: a -> a
id' a = fst (a, id' (a, a))