Haskell:类型推断和函数组合

2023-11-25

这个问题的灵感来自于此answer另一个问题,表明您可以使用定义为的函数从列表中删除每个出现的元素:

removeall = filter . (/=)

用铅笔和纸根据以下类型进行计算filter, (/=) and (.),该函数的类型为

removeall :: (Eq a) => a -> [a] -> [a]

这正是您根据合同所期望的。然而,使用 GHCi 6.6,我得到

gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]

除非我明确指定类型(在这种情况下它工作正常)。为什么 Haskell 为函数推断出这样一个特定的类型?


为什么 Haskell 为函数推断出这样一个特定的类型?

GHCi 正在使用类型默认,从一组可能的类型中推断出更具体的类型。您可以通过禁用来轻松避免这种情况单态限制,

Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall 
removeall :: (Eq a) => a -> [a] -> [a]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell:类型推断和函数组合 的相关文章

  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • 如何在 Haskell 中漂亮地打印表格?

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

    我需要将一个整数数组的数组 基本上是一个二维数组 从根传递给所有处理器 我在 C 程序中使用 MPI 如何声明二维数组的 MPI 数据类型以及如何发送消息 我应该使用广播还是分散 你需要使用播送 http www netlib org ut
  • 什么时候应该使用双精度而不是十进制?

    我可以说出使用的三个优点double or float 代替decimal 使用更少的内存 速度更快 因为处理器本身支持浮点数学运算 可以表示更大范围的数字 但这些优点似乎只适用于计算密集型操作 例如建模软件中的操作 当然 当需要精度时 例
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 在FLUTTER/DART中,为什么我们有时在声明变量时要在“String”后面加一个问号?

    在演示应用程序中 我们找到一个实例 最终字符串 标题 gt 为什么要加这个 在 String 类型之后 class MyHomePage extends StatefulWidget MyHomePage Key key this titl
  • 如何处理最终字符串?

    制作有什么好处吗String as final或者我们可以做String as final 我的理解是 由于 String 是不可变的 因此没有必要将其设为最终的 这是正确的还是人们想要的情况String as Final Code pri
  • 是否有一种类型安全的方法可以将较大的对象减少()为打字稿中的新类型?

    我有一个表示数据库查询结果的数据结构 它是一个具有许多属性的对象 所有属性都是标量 在我的例子中 都是字符串或数字 我想提取这些属性的一部分并填充一个具有已定义形状的新对象 const input Record
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 关于“没有绑定的类型签名”的错误

    我在 Haskell 中遇到 ASCII 问题 fromEnum Char gt Int toEnum Int gt Char offset Int offset fromEnum A fromEnum a toUpper Char gt

随机推荐

  • Java:IndentingXMLStreamWriter 替代方案?

    我正在使用 StAX 创建一个相当大的 xml 文档 到目前为止 我一直在使用 IndentingXMLStreamwriter 类来获取格式良好的文档 另请参阅这个答案 几天前 我们使用较旧的 jdk 版本 6 26 设置了一个 jenk
  • JSF 更新复合组件

    是否可以仅通过指定父复合 ID 来更新复合组件的子组件 例如 如果我有
  • appcfg.py 显示您必须以管理员身份登录

    当我尝试通过以下方式将示例 csv 数据上传到我的 GAE 应用程序时appcfg py 它显示以下 401 错误 2015 11 04 10 44 41 820 INFO client py 571 Refreshing due to a
  • 如何在 Selenium WebDriver 中自动清除浏览器缓存?

    如何在每次测试运行之前清除浏览器缓存 我尝试过driver manage deleteAllCookies in setUp创建驱动程序实例后的方法 它适用于 Firefox 但对于 IE 不起作用 有没有IE的解决办法 请提供给我 您可以
  • .NET 中的跨进程读写同步原语?

    是否有跨进程工作的读 写锁定机制 类似于互斥锁 但读 写而不是独占锁定 我想允许并发读取访问 但允许独占写入访问 Windows 不包含跨进程读写锁 可以使用信号量和互斥量的组合来构造互斥量 互斥量由写入者持有以进行独占访问 或者由读取者持
  • 函数指针如何工作?

    我正在问一些具体问题 如何在类中初始化它们 如何将函数作为参数传递 类中是否需要声明和定义函数指针 对于问题 2 我的意思是 void s void void f function what should I put as type to
  • 通过 jquery 上下移动选择选项

    所以我让这段代码适用于 Firefox 和 Chrome 它的作用是允许您在 HTML 选择表单中重新排序选项 但是当我通过 IE8 测试代码时 它有点不完整 它仅适用于前几次单击 之后您必须多次单击该按钮才能使其工作 有谁知道任何其他代码
  • 解析 HTML 表格最快、最简单、最好的方法是什么?

    我正在尝试获取这张桌子http www datamystic com timezone time zones html转换为数组格式 这样我就可以用它做任何我想做的事情 最好是 PHP Python 或 JavaScript 这种问题经常出
  • RxJs 可观察分页

    第一 这是我使用 RxJs 的第一个项目 我想通过使用它我会学到最好的东西 我找到了这个答案 使用 RxJs 将分页请求转换为 Observable 流但评论里却说 您仍然超出了最大调用堆栈 返回大约 430 页 我认为递归可能不是最好的解
  • Shift + 鼠标滚轮水平滚动

    对于水平滚动 使用 Shift 滚轮相当常见 这两者都相当容易捕获 我可以使用 MouseWheel 事件以及由 KeyDown KeyUp 事件设置的标志来跟踪何时按下 Shift 键 但是 如何真正触发水平滚动呢 我知道 WM MOUS
  • GHC 7.7 中引入的自由覆盖条件破坏了 GHC 7.6 中有效的代码

    The idea 我正在写一个DSL 编译为 Haskell 该语言的用户可以定义自己的不可变数据结构和关联函数 我所说的关联函数是指属于数据结构的函数 例如 用户可以编写 用 pythonic 伪代码 data Vector a x y
  • 如何使用 gitpython 对当前提交与上次提交进行 git diff?

    我正在尝试掌握 gitpython 模块 hcommit repo head commit tdiff hcommit diff HEAD 1 but tdiff hcommit diff HEAD HEAD 不起作用 也不 HEAD HE
  • 是否可以为 UITableView 添加边框样式? (不是边框颜色/边框宽度)

    是否可以为 UITableView 添加边框样式 不仅仅是边框颜色和边框宽度 例如凹槽边框样式 嘿 您可以使用以下方式为您的视图添加边框CALayer可以在QuartzCore Framework 以下链接将帮助您了解CALayer详细 C
  • 如何使用 Eclipse 将特定于平台的本机库包含在 .JAR 文件中?

    我刚刚开始学习JNI 我一直在遵循一个简单的示例 并且创建了一个调用本机库中的 Hello World 方法的 Java 应用程序 我想以 Win32 和 Linux x86 为目标 我的库驻留在 DLL 中 当 DLL 添加到 Eclip
  • 如何阻止 Eclipse 在每次捕获的异常时崩溃?

    当我开始调试 java 项目时 Eclipse 不断地破坏第 3 方库中的随机异常 这非常烦人 知道如何阻止这个吗 我尝试单击断点视图上的 图标 我可以看到 挂起捕获的异常 和 挂起未捕获的异常 复选框都没有选中 Eclipse 仍然在异常
  • SCSS 与字符串的算术运算

    selector width 10px width width 2 output 10px but expected 5px 上面的代码是不言自明的 请纠正我 您可以使用calc功能 selector width 10px width ca
  • 为什么不能在字节变量中存储负值?

    我正在转换可以在 Java 中运行但不能在 C 中运行的代码 byte buffer new byte 64 this buffer int this count 0x3F 128 这会生成编译时错误 常量值 128 无法转换为 字节 如何
  • 如何在 MySQL 中创建时间点架构

    I read this有关为数据库构建时间点架构的文章 在我看来 这是一个优雅的解决方案 但这篇文章是在不久前 2007 年 就已经准备好的 我想知道 1 还有其他方法可以解决这个问题吗 2 这种方法和其他方法的优缺点是什么 3 是否有可供
  • Burn 中的RegistrySearch 与 util:RegistrySearch

    我在用Burn构建 WiX 引导程序 我意识到如下所示的RegistrySearch实际上并没有搜索注册表 我用了过程监控器监视注册表访问
  • Haskell:类型推断和函数组合

    这个问题的灵感来自于此answer另一个问题 表明您可以使用定义为的函数从列表中删除每个出现的元素 removeall filter 用铅笔和纸根据以下类型进行计算filter and 该函数的类型为 removeall Eq a gt a