使用 uncurry 函数进行特定类型推断

2024-03-31

我一直在玩uncurry在 GHCi 中运行函数,我发现了一些我根本无法理解的东西。当我申请时uncurry to the (+)函数并将其绑定到某个变量,如下面的代码所示,编译器推断其类型特定于Integer:

Prelude> let add = uncurry (+)
Prelude> :t add
add :: (Integer, Integer) -> Integer

但是,当询问以下表达式的类型时,我得到(我期望的)正确的结果:

Prelude> :t uncurry (+)
uncurry (+) :: (Num a) => (a, a) -> a

什么会导致这样的情况呢? GHCi 特有吗?

这同样适用于let add' = (+).

注意:我无法使用编译文件重现该内容.


这与ghci无关。这是令人恼火的单态限制。如果您尝试编译以下文件:

add = uncurry (+)
main = do
    print $ add (1,2 :: Int)
    print $ add (1,2 :: Double)

你会得到一个错误。如果你展开:

main = do
    print $ uncurry (+) (1,2 :: Int)
    print $ uncurry (+) (1,2 :: Double)

一切都很好,正如预期的那样。单态性限制拒绝使“看起来像一个值”的东西(即在等号的左侧没有参数定义)类型类多态,因为这会破坏通常发生的缓存。例如。

foo :: Integer
foo = expensive computation

bar :: (Num a) => a
bar = expensive computation

foo保证只计算一次(好吧,至少在 GHC 中),而bar每次提及时都会进行计算。单态性限制旨在通过默认为前一种情况来将您从后一种情况中拯救出来,而这正是您想要的。

如果您只使用该函数一次(或始终使用同一类型),类型推断将负责为您推断正确的类型。在这种情况下,ghci 会通过更快地猜测来做一些稍微不同的事情。但在两种不同类型中使用它可以显示发生了什么。

如有疑问,请使用类型签名(或使用以下命令关闭该讨厌的东西){-# LANGUAGE NoMonomorphismRestriction #-}).

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

使用 uncurry 函数进行特定类型推断 的相关文章

  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • 访问函数中的环境

    In main我可以读取我的配置文件 并将其提供为runReader somefunc myEnv正好 但somefunc不需要访问myEnv读者提供 链中的下一对也没有提供 需要 myEnv 中某些内容的函数是一个微小的叶函数 如何在不将
  • 如何在不实例化一个类的情况下检查它是否继承了另一个类? [复制]

    这个问题在这里已经有答案了 假设我有一个如下所示的类 class Derived some inheritance stuff here 我想在我的代码中检查类似的内容 Derived is SomeType 但看起来像is运算符需要 De
  • Haskell 中的前提条件检查有哪些选项

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

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • DataFrame 中的字符串,但 dtype 是对象

    为什么 Pandas 告诉我我有对象 尽管所选列中的每个项目都是一个字符串 即使在显式转换之后也是如此 这是我的数据框
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • TypeScript:实现具有调用签名和索引签名的接口

    我想创建一个满足此类型的对象 interface I string x string number 并通过 TypeScript 类型检查 理想情况下 我希望不需要诉诸技巧 例如使用any作为中间步骤 我知道可以将其他字段添加到具有调用签名
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009

随机推荐

  • JQuery:更改 URL 参数而不重新加载?

    我有一个问题 在以下条件下是否可以通过 JQuery 更改 URL 相同的 URL 将在浏览器返回和重新加载时加载 更改参数时页面不会重新加载 如果你想阻止页面重新加载 你必须使用哈希 如果你想更改 URL 请尝试 jQuery param
  • 在 Intellij 中找不到日志记录路径

    我想设置我的日志记录路径 以便我可以看到跟踪文件中当前我正在这样做的跟踪 日志记录路径 c temp tracefile log 但我没有看到任何跟踪文件 那么任何人都可以建议这有什么问题吗 或者有没有其他方法可以获取痕迹 请建议 在您的中
  • 如何解决 prestashop 1.5 中从无 cookie 域提供静态内容的问题?

    我在 gtmetrix com 上测试我的网站 它向我显示以下错误 以改进我的网站 yslow scrore 提供来自无 cookie 域的静态内容 如何解决这个错误 您应该创建一些子域 例如 media1 example com medi
  • oh-my-zsh 不应用主题

    我刚刚设置zsh和 一起oh my zsh 但有一些我无法理解的奇怪行为 如果我重新启动终端 或 iTerm 2 两者的行为相同 则指定的主题 zshrc未加载 我需要去做source zshrc让它发生 如果我echo ZSH THEME
  • 如何使用 Struts2 禁用后退按钮

    我在用struts serve static true and struts serve static browserCache false 但后退按钮即使在注销后也能工作 当我单击后退按钮时 它将转到上一个屏幕 我该如何解决这个问题 S2
  • 如何使用 Perl 对 Gmail 进行身份验证?

    我已经安装了this http search cpan org mincus Mail Webmail Gmail 1 09 lib Mail Webmail Gmail pm模块来获取 Gmail 收件箱内的访问和控制 但是 当我尝试通过
  • Git:也移动历史记录中的文件

    是否可以使用 Git 工具将文件移动到新文件夹中 同时修改其完整历史记录 就好像文件从第一次添加时就一直存在在那里一样 我在将一些存储库合并在一起后想到了这一点 我将文件从多个存储库移动到一个 超级 存储库内的不同文件夹 但是合并的历史记录
  • Postman 中 GET 请求中的数组作为参数

    我必须在 GET 请求中发送 ids 数组作为参数 如何在 Postman 中测试它 用于 API 测试的 google chrome 扩展 场景是我有网址 www something com activity poi ids poi id
  • 多处理中出现类似错误。函数参数数量不匹配

    我找不到更好的方法来描述我面临的错误 但每次我尝试对循环调用实现多重处理时 似乎都会出现此错误 我使用了 sklearn externals joblib 和 multiprocessing Process 但错误相似但不同 想要应用多重处
  • 使用 threading.Lock 作为上下文管理器

    在文档中线程 https docs python org library threading html using locks conditions and semaphores in the with statement模块它说 该模块提
  • 在 Heroku 应用程序上安装 spacy en_core_web_lg 时出错

    我正在使用 Django 在 Heroku 上部署我的 ML 模型 我需要en core web lg对于我的应用程序 但无法安装它 我的requirements txt是这样的 djangorestframework 3 12 2 en
  • 如何在 DirectionsRenderer 上获取拖动点

    我使用谷歌地图来绘制我的路线 我只设置了 2 个点 开始和结束 问题是我必须将路线发送到下一页 我知道我可以捕捉事件 google maps event addListener directionsDisplay directions ch
  • Bootstrap 导航栏和内容填充高度弹性框

    我必须创建一个布局 其中内容网格必须位于完整的剩余页面上 但该布局还有一个导航栏 为了做到这一点 我决定将导航栏放在 Flex 容器中 并将内容放在高度为 100 的行中 我需要内容来填充剩余的空间 菜单是动态的 所以我不知道导航栏的高度是
  • vim 将字符替换为 \n

    我需要全部更换 到 n 但是 s n gc不行 See http vim wikia com wiki Search and replace http vim wikia com wiki Search and replace 搜索时 n是
  • 无法在 Mac OS Big Sur 上运行 git

    无法在运行 Big Sur 的新 MacBook 上运行 git 当我尝试运行 git 时 收到以下错误 xcrun 错误 无法加载 libxcrun dlopen Library Developer CommandLineTools us
  • 如何在 ASP.NET MVC 中创建可重用控件

    我应该如何 应该在 ASP NET MVC 3 中创建一些 自定义控件 我对部分观点感到愤怒 ViewUsersControl Html RenderAction 但我仍然不知道哪种方式是剃刀视图正确的 MVC 方式 如果我需要渲染一些aj
  • Jackson自定义反序列化器破坏了其他字段的反序列化

    我需要将 JsonArray 反序列化为布尔值 如果数组存在且不为空 则该值应设置为 true 问题是 我的自定义反序列化器虽然功能正常 但会破坏其余字段的反序列化 它们被设置为空 Object private static class T
  • SQL Server SP - 传递“IN”数组列表的参数?

    有没有办法将值数组作为 SQL Server 2005 的单个参数传递到 SP 的 IN 部分 例如 从 MyTable 中选择 其中 ID IN MyValueArray 在 2005 年及更早版本中 您无法将数组作为参数传递给存储过程
  • 如何强制兼容性视图

    我安装了 IE 11 但我还需要在 IE 8 9 和 10 中运行一些测试 运行测试时如何强制兼容模式 仅供参考 我确实尝试了 F12 并将模式设置为 8 它可以手动工作 但不能通过 selenium 工作 谢谢 我最近遇到了完全相同的问题
  • 使用 uncurry 函数进行特定类型推断

    我一直在玩uncurry在 GHCi 中运行函数 我发现了一些我根本无法理解的东西 当我申请时uncurry to the 函数并将其绑定到某个变量 如下面的代码所示 编译器推断其类型特定于Integer Prelude gt let ad