类型同义词导致类型错误

2023-12-27

作为我之前问题的后续一起使用 makeLenses、类约束和类型同义词 https://stackoverflow.com/questions/30582583/using-makelenses-class-constraints-and-type-synonyms-together我有一个新类型的错误,我想了解一下。

类型错误是由于类型同义词的引入引起的type S = (Num n) => State n在下面的例子中。

{-# LANGUAGE TemplateHaskell #-}                                                                                                                              
{-# LANGUAGE RankNTypes #-}                                                                                                                                   

module Foo where                                                                                                                                              

import Control.Lens                                                                                                                                           

data State a = State { _a :: a                                                                                                                                
                     } deriving Show                                                                                                                          

makeLenses ''State -- Requires TemplateHaskell                                                                                                                

-- | Smart constructor enforcing class constraint on record field _a.                                                                                         
mkState :: (Num a) =>  a -> State a                                                                                                                           
mkState n = State {_a = n}                                                                                                                                    

doStuff1 :: Num a => State a -> State a                                                                                                                       
doStuff1 s = s & a %~ (*2)                                                                                                                                    

test1a = doStuff1 $ mkState  5   -- results in State {_a = 10.0}                                                                                              
test1b = doStuff1 $ mkState  5.5 -- results in State {_a = 11.0}                                                                                                                                                           

type S = (Num n) => State n -- Requires the RankNTypes extensions                                                                                             

doStuff2 :: S -> S                                                                                                                                            
doStuff2 s = s & a %~ (*2)                                                                                                                                    

test2a = doStuff2 $ mkState  5   -- Results in State {_a = 10.0}                                                                                              
--test2b = doStuff2 $ mkState  5.5 -- Type error.

如果我取消注释test2b我收到以下错误。

Could not deduce (Fractional n) arising from the literal `5.5'
from the context (Num n)
  bound by a type expected by the context: Num n => State n
  at Foo.hs:32:10-32
Possible fix:
  add (Fractional n) to the context of
    a type expected by the context: Num n => State n
In the first argument of `mkState', namely `5.5'
In the second argument of `($)', namely `mkState 5.5'
In the expression: doStuff2 $ mkState 5.5

我希望能够理解为什么引入的类型同义词会导致此错误以及如何破译错误消息。


S -> S不等于forall n. Num n => State n -> State n。它相当于(forall n. Num n => State n) -> (forall n. Num n => State n)。前者意味着,对于所有数字类型n,我们可以传入一个State n并取回State n(对于同类型n)。后者意味着我们传递的东西可以是State n对于所有数字类型n我们得到的东西可以是State n对于所有类型n。换句话说,参数和结果都是多态的。

这意味着您传入的参数必须具有类型Num n => State n,不是更具体的类型,例如,State Int。这对于5,其类型为Num n => n, 但不是5.5,其类型为Fractional n => n.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型同义词导致类型错误 的相关文章

随机推荐

  • NSRangeException:调用堆栈未显示行号

    我收到以下索引越界错误 Terminating app due to uncaught exception NSRangeException reason NSArrayM objectAtIndex index 0 beyond boun
  • 在 C# 中如何检查字符串变量是否为空或 null? [复制]

    这个问题在这里已经有答案了 如何检查 C 变量是否为空字符串 或空 我正在寻找最简单的方法来进行此检查 我有一个变量可以等于 或为空 是否有一个函数可以检查是否不存在 或空 if string IsNullOrEmpty myString
  • 如何在 Windows 7 上安装支持 Python 的 GDB

    我需要调试 cython 代码 官方文档说 我需要安装 gdb 7 2 或更高版本 使用 Python 支持构建 不幸的是 我没有找到任何如何在 Windows 7 上安装它的分步指南 我是否必须自己构建它 如何构建 或者已经存在适用于 W
  • Windows Installer 和 WiX 的创建

    我们目前使用 WiX 来构建 MSI 文件 因此它是我有过使用经验的唯一 MSI 构建器 我知道您可以在 Visual Studio 中本地构建安装程序 使用 WiX 和 Windows Installer 有什么区别 各自的优缺点是什么
  • Keycloak:验证访问令牌并获取 keycloak ID

    我需要能够执行以下操作 使用纯 cURL 和 JSON 服务器端 无框架或 Java 使用第 3 方提供的 Keycloak 访问令牌的字符串表示形式来验证令牌是否有效 如果令牌有效 则获取该用户的 Keycloak ID 如何使用普通的旧
  • 在viewpager中可以实现这种效果吗?

    我在用ViewPager in Activity 我需要在页面翻转之间产生这种效果 除了在 Android 的主屏幕之间切换之外 我从未见过这样的效果 如果您使用过这个动画或者您听说过动画的名字 请帮助我 我对这部动画没有任何想法 这种效应
  • 如何调试 linq to sql InsertOnSubmit 语句?

    以下代码可以正常工作 db DBUsers InsertOnSubmit new DBUser AllTheStuff valuesBeyondYourWildestDreams db SubmitChanges 我的猜测是数据库发生了一些
  • Ruby:过滤哈希键的最简单方法?

    我有一个看起来像这样的哈希 params irrelevant gt A String choice1 gt Oh look another one choice2 gt Even more strings choice3 gt But w
  • 使用curl获取标头

    为什么这不起作用 curl X HEAD http www google com 但这些都工作得很好 curl I http www google com curl X GET http www google com 您需要将 i 标志添加
  • Android,广播可分包数据

    我已经实现了一个扩展NotificationListenerService 的类 它可以很好地接收发布的通知 然后我想获取收到的 statusBarNotification 对象并广播它 我会做以下事情 Override public vo
  • 在终端中运行 Swift 构建会导致“平台路径”错误

    我最近重新格式化了我的 Mac 今天我尝试通过终端构建一个 swift 可执行文件来启动服务器端 swift 项目 以下是我使用过的命令 swift package init type 可执行文件 快速构建 运行时swift build 我
  • 如何限制 matplotlib 图形的边框大小?

    我正在制作一些相当大的图表 边框中的空白占用了很多像素 这些像素可以更好地被数据使用 看起来边界随着图形的增长而增长 以下是我的图形代码的核心内容 import matplotlib from pylab import figure fig
  • 类型级编程中的协方差

    我正在尝试创建与 Scala 库中的元组等效的类型元组 仅使用 方法通过添加第 N 1 个值将元组扩展为元组 这样我就能够递归地构造元组 class Test abstract class Tuple protected type Next
  • 应用黑白不透明度后生成颜色

    我什至不知道如何描述我想要什么 但就是这样 假设我有 3 个文本框 我在第一个文本框中输入一些颜色十六进制代码 我想在其顶部应用黑色图层 并将不透明度设置为 50 并在第二个文本框中获取结果颜色 同样的事情 但第三个是白色的 让我解释一下
  • 使用 Querydsl 在 Spring 中仅选择特定列?

    假设我有一个名为Employee有 70 列 我如何实现查询SELECT id from t employee in spring querydsl无需修改此代码中的大量代码 BooleanExpression paramEmployee
  • 如何将两个图像视图从中心动画到彼此相对?

    我想将两个图像从屏幕中间动画化为彼此相对 就像下图一样 到目前为止我所做的一切现在我只能从左到右为一张图像制作动画 反之亦然 但现在我想从中间为它们制作动画 这是我的代码 b1 Button findViewById R id button
  • 如何将 React-native-google-mobile-ads 与 Expo 和 Expo Go 结合使用?

    如何将 React native google mobile ads 与 Expo 和 Expo Go 结合使用 例如横幅广告 非常感谢世博会背景下的一个最小例子 截至 2022 年 5 月 所有在线 Google 文档均引用 expo a
  • SQL中将一个表的所有值插入到另一个表中

    我正在尝试将一个表的所有值插入到另一个表中 但是插入语句接受值 但我希望它接受来自initial Table 的 select 这可能吗 insert 语句实际上有一个语法可以做到这一点 如果您指定列名称而不是选择 那么会容易得多 INSE
  • 基于语言的安装描述

    众所周知 一旦您在 Joomla 后端安装了扩展 就会显示描述 您可以使用 XML 中的简单描述 也可以使用基于语言的描述 过去我在基于语言的描述方面从未遇到过问题 但这次我遇到了 该扩展是一个管理组件 没有前端文件夹 适用于 Joomla
  • 类型同义词导致类型错误

    作为我之前问题的后续一起使用 makeLenses 类约束和类型同义词 https stackoverflow com questions 30582583 using makelenses class constraints and ty