了解函数类型

2024-06-22

我在尝试理解 Haskell 如何确定函数类型时感到有点困惑。这是一个例子:

boolFcn x y = x/=3 && y/=4

当我检查上述函数的类型时,它给出了结果:

(Num a1, Num a, Eq a1, Eq a) => a -> a1 -> Bool

这是另一个例子:

triangles = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10] ]   

并申请:t on triangles结果:

(Num t2, Num t1, Num t, Enum t2, Enum t1, Enum t) =>  [(t, t1, t2)]

我脑子里出现了一些问题,但我自己很难解决:

  1. 为什么 boolFcn 的类型由以下组成a, a1文字,而三角形的类型包括t,t1文字?有什么区别吗a and t?
  2. 为什么这个 boolFcn 类型不能简化为:

    (Num a, Eq a) => a -> a -> Bool

a and a1具有相同的类型类,那么为什么我不能简单地使用一个来编写它们a?当我检查函数的类型时:

let sumthis x y = if x > y then x+y else x-y

我得到一个结果:

(Ord a, Num a) => a -> a -> a

为什么它没有导致:

(Ord a, Num a, Ord a1, Num a1) => a -> a1 -> a

如果这个问题很微不足道,我很抱歉,尽管我很乐意听到对此问题的任何解释/提示。


  1. Yes, a and t在这些例子中本质上是相同的。差异只是类型推断算法的副作用。

  2. 嗯,在boolFcn, (Num a, Eq a) => a -> a -> Bool不够通用,因为前两个参数不必是同一类型。考虑以下调用:

    boolFcn (4::Int) (4::Double)

    这是有效的,因为Int and Double都是该组织的成员Num and Eq类型类,但它们显然不是同一类型。在你的sumthis例子,x and y必须是相同类型,因为它们用作需要相同类型参数的函数的输入。

    我们可以通过检查看到:t (+),返回(+) :: Num a => a -> a -> a。由于参数为+必须是同一类型,x and y必须是同一类型,所以sumthis必须需要相同类型的参数。所以

    sumthis (4::Int) (4::Double)

    将无效。

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

了解函数类型 的相关文章

  • haskell复制目录的方法是什么

    我发现自己用 Haskell 编写越来越多的脚本 但在某些情况下 我真的不确定如何 正确 地做到这一点 例如递归地复制目录 a la unixcp r 由于我主要使用 Linux 和 Mac OS 所以我通常会作弊 import Syste
  • 系统地将函数应用于 haskell 记录的所有字段

    我有一条包含不同类型字段的记录 以及一个适用于所有这些类型的函数 举一个小 愚蠢 的例子 data Rec Rec flnum Float intnum Int deriving Show 比如说 我想定义一个为每个字段添加两条记录的函数
  • ~/.cabal/config 中的“共享”是什么意思?

    我想 共享 会让cabal install更快 对吧 共享的默认值为 False 我们应该使用 True 还是 False 来共享 thanks 这意味着 还构建动态链接 又名共享 版本的库 这些版本与cabal install cabal
  • Clojure:如何生成“trie”?

    鉴于以下 def inTree 1 2 1 2 3 1 2 4 5 9 1 2 4 10 15 1 2 4 20 25 你如何将它转换成这个特里树 def outTrie 1 2 3 4 5 9 10 15 20 25 这是一个清理后的解决
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变
  • 如何在 Haskell 中创建异构列表? (最初是Java)

    如何将以下 Java 实现转换为 Haskell 这里的主要目的是拥有一个包含作为特定接口的子类型的各种元素的列表 我尝试制作下面的 Haskell 版本 但未能达到我的目的 这里的重点是xs有类型 Bar 而不是Foo a gt a 这是
  • Swift:延迟封装映射、过滤器、FlatMap 链

    我有一份动物清单 let animals bear dog cat 以及一些改变该列表的方法 typealias Transform String gt String let containsA Transform 0 contains a
  • 如何让 Either Monads 了解异步函数(Promises/Future)

    我正在尝试使用 Either Monad 来传输数据 问题是我无法弄清楚如何让我的 Monad 意识到异步操作 这是我所拥有的 let processData Either either sendError sendResponse pro
  • Coq:Type(n) 中的 Prop 与 Set

    我想考虑以下三个 相关的 Coq 定义 Inductive nat1 Prop z1 nat1 s1 nat1 gt nat1 Inductive nat2 Set z2 nat2 s2 nat2 gt nat2 Inductive nat
  • Haskell 中是否可以部分应用第 n 个参数?

    我很好奇是否可以写一个函数apply nth它接受一个函数 参数的数量以及该参数的值 然后返回一个新的 部分应用的函数 我的感觉是 由于类型系统的原因 这是不可能的 但我无法给出令人满意的答案 我也无法提出工作类型签名 如果语言的类型更加松
  • F# 中灵活类型注释的用途是什么?

    我正在学习 F 我不明白灵活类型的目的 或者更好的是 我无法理解这样写的区别 set TextOfControl c Control s c Text lt s 并写下 set TextOfControl c T when T gt Con
  • 如何简洁地写一个 || b 其中 a 和 b 是可选值?

    我对任何语言的答案都很满意 但我最终想要 Java 的答案 Java 8 没问题 不限于 Java 8 我尝试修复标签 如果我有两个Optional
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • 关注点分离:什么时候最好将语义与语法分离?

    Choices 类型类的出色之处在于它们允许我们将额外的结构连接到现有类型 从而使我们能够推迟一些设计决策 而不是在构思时匆忙做出决定 另一方面 例如 在面向对象编程中 我们被迫考虑类型需要立即执行什么操作 以及稍后出现的或需要的任何附加结
  • 追踪 Haskell 中的错误

    我如何获得有关 Haskell 错误发生位置的更多信息 例如 昨天我正在开发一个 Haskell 程序 该程序解析输入文件 转换数据 然后打印出报告信息 有一次 我跑了 main 然后回来了 Prelude read parse error
  • 如何在 Haskell 中编写 MST 算法(Prim 或 Kruskal)?

    我可以用 C 或 Java 编写 Prim 和 Kruskal 算法来查找最小生成树 但我想知道如何在 Haskell 中以 O mlogm 或 O mlogn 实现它们 纯函数式程序更好 多谢 正如斯文宁森所说 优先搜索队列 http h
  • 为什么 Haskell 没有 I Monad(仅用于输入,与 IO monad 不同)?

    从概念上讲 执行输出的计算似乎与仅执行输入的计算有很大不同 从某种意义上说 后者更为纯粹 就我而言 我希望有一种方法将程序中仅输入的部分与可能实际写出内容的部分分开 那么 为什么没有输入只有 Monad 呢 为什么拥有一个 I monad
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 使用 Haskell 识别段落中的单词数

    我是 Haskell 和函数式编程的新手 我有一个 txt包含一些段落的文件 我想使用 Haskell 计算每个段落中的单词数 我已经写了输入 输出代码 paragraph words String gt int no of words I
  • 如何查找列表中元素的索引?

    给定列表中的一个元素 我可以使用哪个函数来查找其索引 例如 我想在列表中找到 3 的索引 1 2 3 4 Haskell 中有哪个函数可以用于此目的 看看这里 在 Haskell 中查找列表中元素的索引 https stackoverflo

随机推荐

  • 使用 sed 删除带有方括号和引号的模式

    如何使用 sed 删除具有此模式的行 resourceNames I tried sed i resourceNames d sa yaml 文件的一部分看起来像这样 apiGroups resources secrets resource
  • 未捕获的类型错误:YT.Player 不是构造函数

    我希望有人能帮忙解决这个问题 当我位于页面上大约 5 个选项卡中的一个选项卡上时 我收到以下错误 Uncaught TypeError YT Player is not a constructor 我单击页面上的按钮 它会弹出一个模式窗口
  • 我可以获得当前加载的所有模块的列表吗?

    module info 会告诉我很多关于模块的信息 前提是我知道它的名称 我需要找到名称符合特定条件的所有模块 例如 companyname creator serialnumber 我记得在 erlang 存储此信息的地方读过 但我正在寻
  • 如何创建多个列表? [复制]

    这个问题在这里已经有答案了 我正在尝试创建多个列表 如下所示 l1 l2 ln 有什么办法可以做到这一点吗 你可以做的是使用字典 gt gt gt obj gt gt gt for i in range 1 21 obj l str i g
  • 使用 PTRACE_SINGLESTEP 仅拦截系统调用

    我们有一个学校项目 需要重新编码 strace 我们只需拦截像 write 和 read 这样的系统调用 但我们不能使用PTRACE SYSCALL 我正在寻找一种方法来使用PTRACE SINGLESTEP 我已经编写了一种打印系统调用的
  • 当引导模式打开时如何防止正文内容滚动

    我正在使用 Angular UI Bootstrap模态框 http angular ui github io bootstrap modal 当模式打开时 主体有一个滚动条 当我滚动时 模式后面的内容也会滚动 我可以将溢出 隐藏到正文标记
  • 如何从非图像的 WebSocket 读取 BLOB 数据

    我创建了一个到网络服务器的 WebSocket 连接来接收一些数据 但是 当我记录在onmessage函数 那么我就看不到数据的真实内容 当我复制 Chrome 浏览器 v32 作为curl 命令打开的网络连接并在我的操作系统控制台上运行它
  • 使用 AWS Lambda 在无服务器中 Cron 作业触发两次

    我正在运行一个 Cron 作业 该作业每周日上午 10 00 UTC 运行 它将短信推送到电报组 这是我的完整代码 https github com deadcoder0904 lessons of hn telegram bot 以下相关
  • C# 自定义列表视图

    有人有关于创建 绘制自定义 ListView 对象的任何信息吗 目前我正在从事一个需要在应用程序中定制外观和感觉的项目 我使用的是标准 Windows Forms ListView 它与 GUI 的其余部分的风格不同 我们没有使用自定义控件
  • java中的四舍五入值

    我将如何圆 1 1 5 怎么样 double rounded Math ceil number 2 2 Since Math ceil 已经返回双精度值 无需除以2 0d这里 只要您在可以表示为双精度数的整数范围内而不丢失精度 这就可以正常
  • 近4季度数据

    我想获取最后 4 个季度的数据 包括当前季度的数据 假设如果我运行查询30 MAR 2019然后我想要来自的数据01 APR 2018 to 31 MAR 2019如果我运行查询01 apr 2019然后我想要之间的数据01 JUL 201
  • 将 Serilog 配置代码行转换为 json 配置时遇到问题

    我发现一篇博文解释了如何按 LogEvent 级别过滤到单独的文件以进行 Serilog 配置 我正在 appsettings json 中进行所有 Serilog 配置 这在 json 配置中看起来怎么样 我似乎不知道如何 json la
  • Java Webstart 无法脱机工作(NoRouteToHostException/UnknownHostException)

    我想配置我的 webstart app jnlp 以便如果没有可用的互联网连接 它将从缓存启动 然而 当我断开与互联网的连接时 尽管配置如下 但我总是收到 NoRouteToHostException 或 UnknownHostExcept
  • 交错行二维 Numpy 数组

    我有一个 2D numpy 数组 如下所示 array x1 x2 x3 x4 x2 x3 x4 x5 x3 x4 x5 x6 y1 y2 y3 y4 y2 y3 y4 y5 y3 y4 y5 y6 我想交错行 使数组看起来像这样 arra
  • 使用查找函数未找到值的错误消息

    我使用此代码来检查条形码是否在数据库中 但每次条形码不在列表中时 它都会提示一条错误消息 运行时错误 91 未设置对象变量或 With 块变量 是否有一行我可以像消息框一样添加 表明输入的条形码无效 我知道这就是我所需要的 但显然 我不知道
  • rabbitmq的兑换次数有限制吗?

    在文档或谷歌上找不到任何关于此的信息 除了它应该绑定到服务器的可用资源 有人有在工作环境中一次进行大量交换的经验吗 仅创建交换不应成为问题 直到达到内存限制为止 而是在具有高消息吞吐量且主要是动态交换创建 删除的工作项目中使用它 考虑到 R
  • 为什么不允许使用 lock(),但允许使用 Monitor.Enter()?

    对于以下代码 我收到编译时错误 int 不是引用类型 lock 语句所要求的 int i 0 lock i 但没有错误 int i 0 Monitor Enter i 据我所知 由于装箱引起的复杂性 值类型不应该用于锁定 但是 那为什么它可
  • 如何将依赖包引用到 Android 库(如 .aar 文件)中?

    我有一个 android library 插件 它使用多个作为 jar 文件包含的 android 库 并直接从我的 build gradle 文件引用 compile fileTree dir libs include jar 然后我会发
  • C# 如何读取值并将其放入数组中

    我今天开始发现 C 如你所知 有一些困难 using System using System Collections Generic using System Linq using System Text namespace Console
  • 了解函数类型

    我在尝试理解 Haskell 如何确定函数类型时感到有点困惑 这是一个例子 boolFcn x y x 3 y 4 当我检查上述函数的类型时 它给出了结果 Num a1 Num a Eq a1 Eq a gt a gt a1 gt Bool