镜头变焦模糊变量

2024-04-17

我在使用时遇到困难zoom函数由下式给出Control.Lens。使用我的自定义 monad 变压器HearthMonad,我不知道如何满足GHC的“模棱两可型”投诉。

有问题的代码位于drawCard.

我该如何解决这个问题?我是否必须创建自己的自定义缩放运算符来处理Monad m in Hearth m?


{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}


module EngineZoom where


--------------------------------------------------------------------------------


import Control.Applicative
import Control.Lens
import Control.Monad.State
import Data.List
import Data.Maybe


--------------------------------------------------------------------------------


type PlayerHandle = String


data Card = Card String
    deriving (Show, Eq, Ord)


data Player = Player {
    _playerHandle :: PlayerHandle,
    _hand :: [Card]
} deriving (Show, Eq, Ord)
makeLenses ''Player


data GameState = GameState {
    _gamePlayers :: [Player]
} deriving (Show, Eq, Ord)
makeLenses ''GameState


newtype Hearth m a = Hearth {
    unHearth :: StateT GameState m a
} deriving (Functor, Applicative, Monad, MonadState GameState, MonadIO, MonadTrans)


type HearthMonad = MonadIO


runHearth :: (HearthMonad m) => m ()
runHearth = evalStateT (unHearth runGame) mkGameState


mkGameState :: GameState
mkGameState = GameState { _gamePlayers = map mkPlayer ["Bob", "Joe"] }


mkPlayer :: PlayerHandle -> Player
mkPlayer handle = Player { _playerHandle = handle, _hand = [] }


runGame :: (HearthMonad m) => Hearth m ()
runGame = do
    card <- drawCard "Bob"
    liftIO $ print card


getPlayer :: PlayerHandle -> Lens' GameState Player
getPlayer handle f st = fmap put' get'
    where
        players = st^.gamePlayers
        put' player = let
            g p = case p^.playerHandle == handle of
                True -> player
                False -> p
            in set gamePlayers (map g players) st
        get' = f $ fromJust $ find (\p -> p^.playerHandle == handle) players


drawCard :: (HearthMonad m) => PlayerHandle -> Hearth m Card
drawCard handle = do
    let card = Card "Yeti"
    --getPlayer handle.hand <>= [card]
    zoom (getPlayer handle) $ hand <>= [card]
    return card

EngineZoom.hs:86:5:
    Could not deduce (Control.Lens.Internal.Zoom.Zoomed (Hearth m)
                      ~ Control.Lens.Internal.Zoom.Zoomed m0)
    from the context (HearthMonad m)
      bound by the type signature for
                 drawCard :: HearthMonad m => PlayerHandle -> Hearth m Card
      at EngineZoom.hs:82:13-60
    NB: `Control.Lens.Internal.Zoom.Zoomed' is a type function, and may not be injective
    The type variable `m0' is ambiguous
    Relevant bindings include
      drawCard :: PlayerHandle -> Hearth m Card
        (bound at EngineZoom.hs:83:1)
    In the expression: zoom (getPlayer handle)
    In a stmt of a 'do' block:
      zoom (getPlayer handle) $ hand <>= [card]
    In the expression:
      do { let card = Card "Yeti";
           zoom (getPlayer handle) $ hand <>= [card];
           return card }

问题是你的新类型只能保持一种状态,即GameState。变焦实质上改变了镜头目标的状态,但由于Hearth不能有Player作为一个州,zoom (getPlayer handle)不能与Hearth.

简单的解决方案是将 newtype 替换为type Hearth = StateT GameState和缩放工作。如果你想要一个新类型,你需要将状态参数化,下面是一个例子:

import Control.Lens.Internal.Zoom

newtype HearthS s m a = Hearth {
    unHearth :: StateT s m a
} deriving (Functor, Applicative, Monad, MonadState s, MonadIO, MonadTrans)

type Hearth = HearthS GameState

type instance Zoomed (HearthS s m) = Focusing m
instance Monad z => Zoom (HearthS s z) (HearthS t z) s t where
  zoom l (Hearth m) = Hearth (zoom l m)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

镜头变焦模糊变量 的相关文章

  • 使用 Rank2Types 相比 RankNTypes 有什么优势吗?

    据我所知 仅 针对 2 级类型存在可判定的类型检查算法 GHC 是否以某种方式利用了这一事实 它有任何实际意义吗 是否还有 2 级类型的主要类型概念和类型推断算法 如果是的话 GHC 使用它吗 与Rank 2类型相比 Rank 2类型还有其
  • 什么时候可以将函数绑定到另一个名称?

    在解释器中工作时 将函数绑定到名称通常很方便 例如 ghci gt let f 1 ghci gt f 1 2 这是别名f到函数 1 简单的 然而 这并不总是有效 我发现导致错误的一个例子是尝试使用别名nub来自Data List模块 例如
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • 功能段落

    抱歉 我还不太明白 FP 我想将一系列行分割成一系列行序列 假设一个空行作为段落划分 我可以在 python 中这样做 如下所示 def get paraghraps lines paragraphs paragraph for line
  • Haskell - 无法将类型“PersistEntityBackend record0”与“SqlBackend”匹配

    我正在尝试通过 Yesod 中的 id 获取记录 我的代码是 getEditActorR Handler Html getEditActorR do actorId lt runInputGet ireq intField id actor
  • Haskell 错误:“非详尽模式”

    所以我有这个功能 当我尝试像这样使用它时 合并排序列表 1 1 1 1 它给了我一个错误 1 1 例外 SortFunctions hs 86 1 91 89 非详尽 函数 mergeSortedLists 中的模式 85 mergeSor
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • 运营商部分应用

    如果我想在字符末尾添加一个空格以返回列表 如果我不传递任何参数 我将如何通过部分应用程序来完成此操作 还有类型是 space Char gt Char 由于使用 和 运算符出现 解析错误 我在末尾添加空格时遇到问题 到目前为止我所拥有的是
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 使用 cabal new-install 重新安装相同版本的软件包

    我正在开发 Haskell 包 我还没有上传到Hackage 版本号是0 1 0 0 我正在使用新风格的 Cabal 命令 为了在我处理包的同时测试它 使库可用于测试项目 我运行cabal new install lib构建包后 然而 我注
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什

随机推荐

  • 如何使用 Jetpack Compose 显示在单击按钮时隐藏的 IconButton?

    我在我的ViewModel类 一个State对象的默认值为false var menuState mutableStateOf false 现在我想显示IconButton根据 的值menuState setContent Scaffold
  • 使用 numpy nan 查找列表的最大值[重复]

    这个问题在这里已经有答案了 import numpy as np print max np nan 1 2 3 4 print max 1 2 3 4 np nan print max 1 2 3 np nan 4 第一个将打印 nan 作
  • 物理地址、设备地址和虚拟地址的区别

    有什么区别设备地址 实际地址 and 虚拟地址 其实我正在努力mmap在驱动程序中 我一直坚持这个概念 The 文档 https www kernel org doc Documentation DMA API HOWTO txt says
  • 无法获取 org.hibernate.persister.entity.SingleTableEntityPersister 错误的构造函数

    我不是 hibernate 的频繁用户 我正在尝试创建多对一映射 但出现错误 主题 我一直在寻找类声明中的错误 还有 getter 最后一个错误 但一切似乎都是正确的 有人看到我的代码中有任何错误吗 因为我无法弄清楚 地址 java pac
  • 从环境中检索“一周的第一天”和“CalendarWeekRule”

    我认为这应该很容易 但我自己 还 找不到它 我需要知道是否可以从系统环境和 或本地设置中检索这两个值 我知道在我的国家 荷兰 这些价值观应该是 每周第一天 星期一 日历周规则 FirstFullWeek 但我不想为此设定固定的规则 您可以从
  • 使用 WinForms TreeView 递归目录列表?

    我想制作一个树视图 显示系统上的所有文件夹 并且仅显示音乐文件 例如 mp3 aiff wav 等 我记得读到我需要使用递归函数或类似的东西 通常大多数计算机都有数千个文件夹和数十万个文件 因此递归地在 TreeView 中显示所有这些文件
  • D3 V6 - 缩放和拖动功能

    在 Angular 7 中使用 D3 v6 创建世界地图 Choropleth 从 Angular 精简为纯 JavaScript 从 NaturalEarth 收集并在 mapshaper 中编译的形状文件以创建 GeoJSON 只对国家
  • jQuery-UI 主题 - CSS 大小差异

    当使用jQueryUI http www jqueryui com home网站上的示例 主题浏览器 http www jqueryui com themeroller 事情看起来很棒 但是 当我将代码和主题放入我的应用程序中时 大小调整完
  • Tornado with_timeout 正确用法

    我有一个运行一些 shell 命令的网络服务器 该命令通常需要几秒钟 但在某些情况下需要更多时间 在这种情况下客户端 不是网络浏览器或curl 会断开连接 我无法修复客户端 所以我考虑修复服务器 它基于龙卷风框架 我使用tornado ge
  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • Easy Tracker 中的 Google 分析自定义屏幕名称

    我有一个具有重用活动的应用程序 它用于不同的目的 因此仅跟踪活动名称对我没有帮助 这就是为什么我想在仍然使用 EasyTracker 的同时手动定义屏幕名称 我的代码如下所示 EasyTracker t EasyTracker getIns
  • Python:找到出现次数最多的单词?

    我试图让我的程序报告文本文件中出现最多的单词 例如 如果我输入 你好 我喜欢馅饼 因为它们非常好吃 程序应该打印出 最喜欢的馅饼 执行选项 3 时出现此错误 KeyError h Prompt the user to enter a blo
  • chrome 扩展,弹出窗口的高度

    在我看来 弹出窗口的高度有 489 像素的限制 如果我将弹出窗口的主体元素设置为 600 像素的高度 则弹出窗口将获得一个滚动条 因为内部页面变大 但弹出窗口不会更改其大小 是否可以使弹出窗口的高度大于 489 像素 Set height两
  • 在 iOS 12 中以编程方式从屏幕时间获取应用程序使用情况

    我正在开发一个项目 我想获得其他应用程序的使用时间 苹果发布了iOS 12并提供了新功能Screen Time 我想知道Apple是否提供任何方式或API来从中获取数据 不可以 在 iOS 上 每个应用程序都在自己的沙箱中运行 无法查看其他
  • 在 Angular 4 中使用权限的最佳方式是什么?

    在我的 Angular 4 项目中 我想使用从 API 获得的权限 权限保存为带有 ids 的数组 某些单个元素 例如用户或博客文章 具有允许权限的属性 这些属性允许或不允许编辑或删除等操作 作为带有 id 的数组 在 Angular 4
  • CruiseControl.Net + SSL

    因此 我刚刚在我的 PC 上安装了 Cruisecontrol NET 并且使用 VisualSVN 通过 https 和 虚拟 证书进行 SVN 托管 所有这些都在我的本地电脑上 问题是 当我尝试运行 Cruisecontrol NET
  • 如何在页面加载时将页面滚动到底部?

    要求 我想在页面加载时将内容滚动到页面底部 这是我的 html 代码
  • 宏定义确定大端还是小端机?

    是否有一行宏定义来确定机器的字节顺序 我正在使用以下代码 但将其转换为宏会太长 unsigned char test endian void int test var 1 unsigned char test endian unsigned
  • 默认情况下,ASP.NET MVC 4 是否需要额外的 XSS 处理

    默认情况下 ASP NET MVC 4 会忽略帖子消息中的 HTML 输入 如果我没有明确接受 HTML 是否需要编写任何代码来保护我的网站免受 XSS 攻击 我不会使用 AllowHtml or ValidateInput false 我
  • 镜头变焦模糊变量

    我在使用时遇到困难zoom函数由下式给出Control Lens 使用我的自定义 monad 变压器HearthMonad 我不知道如何满足GHC的 模棱两可型 投诉 有问题的代码位于drawCard 我该如何解决这个问题 我是否必须创建自