开发Brick贪吃蛇游戏时使用lens出现Variable not in scope错误如何解决
问题原因与解决方案
报错根本原因
你确实遗漏了lens的生成配置,microlens的makeLenses需要显式调用,才会为带下划线前缀的record字段生成对应的无前缀lens实例:
- 第一次
paused变量不在作用域报错:你没有调用makeLenses为_paused字段生成对应的pausedlens,编译器无法找到该标识符 - 替换为
_paused后的类型报错:_paused是普通的record字段访问函数,类型为Game -> Bool,而透镜运算符(^.)要求第二个参数是Lens.Micro.Type.Getting类型的透镜对象,二者类型不匹配导致报错。
修复方法
在Game数据类型定义的下方,添加一行Template Haskell调用即可:
makeLenses ''Game
调用后makeLenses会自动为所有带_前缀的字段生成对应的无前缀lens,你代码中用到的paused、dead、frozen等透镜就能正常被(^.)、(.~)等透镜运算符识别使用。
内容的提问来源于stack exchange,提问作者geckos
相关产品推荐
相关产品推荐

