镜头访问Map Key

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (10)

使用Lens库访问Map Data类型时遇到一些问题。

data Card
  = Ferme
  | Boulangerie

data PlayerState = PlayerState {
  _psCards      :: Map Card Int,
  } deriving (Show)


data GameState = GameState {
  _gsPlayers      :: [PlayerState]
                 } deriving (Show)

我很难进入 Map

step :: (MonadState s m, HasGameState s, MonadIO m) => m ()
step = do
    i <- use $ gsPlayers . ix 0 . psCards . ix Ferme

出现以下错误:

    • Could not deduce (Monoid Int) arising from a use of ‘ix’
      from the context: (MonadState s m, HasGameState s, MonadIO m)
        bound by the type signature for:
                   step :: forall s (m :: * -> *).
                           (MonadState s m, HasGameState s, MonadIO m) =>
                           m ()

这是因为ix在同一行使用不同的参数吗?

提问于
用户回答回答于

这是因为ix是一个Traversal,但use期待一个镜头。不同之处在于镜头始终只有一个目标。遍历可以为零或更多。在检索值时,期望镜头的组合器意外地尝试将多个值组合在一起作为Monoid给定遍历的时间。(特别是它来自Applicative实例Const。)该尝试不会在您的情况下键入检查,因为目标类型不存在此类实例,因此您将收到该错误消息。

您可能希望使用preuse组合器代替use,以便考虑可能不存在的值。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • o o

    3 粉丝490 提问2 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券