如何编译在 StateT monad 中使用透镜的 ghc-8.4.2 代码



我试图从Gabriel Gonzales 2013年的博客文章"程序命令式使用Haskell镜头"中编译这个小程序:

{-# LANGUAGE TemplateHaskell #-}
import Control.Lens 
import Control.Monad.Trans.Class
import Control.Monad.Trans.State
data Game = Game
{ _score :: Int
, _units :: [Unit]
, _boss  :: Unit
} deriving (Show)
data Unit = Unit
{ _health   :: Int
, _position :: Point
} deriving (Show)    
data Point = Point
{ _x :: Double
, _y :: Double
} deriving (Show)     
makeLenses ''Game
makeLenses ''Unit
makeLenses ''Point    
strike :: StateT Game IO ()
strike = do
lift $ putStrLn "*shink*"
boss.health -= 10

我收到错误:由于使用"-="而引起的(Control.Monad.State.Class.MonadStat Game (StateT Game IO((没有实例

这些天需要哪些进口?

StateT有多个版本。要找出您需要哪一个,您必须转到 Haddock 文档以获取有问题的函数(在本例中为(-=)并按照其定义中的链接进行操作。

有两个monad变压器包,称为">mtl"和">transformers",所以我的第一个想法是你可能用错了。然而,当我点击(-=)运算符的链接时,我发现自己进入了附属图书馆,这也是镜头作者爱德华·凯米特(Edward Kmett(的。

因此,要获得(-=)和它的亲戚,看起来您必须从附属词中导入Control.Monad.Representable.State

编辑查看源代码以查找Control.Monad.Representable.State它似乎正在从转换器库中重新导出MonadState类。因此,请确保您使用的是那个而不是mtl

最新更新