我试图从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。