Haskell“没有实例”错误

2023-11-30

我正在尝试编写一个函数来检查数字是否为素数。我写了这个:

primeCheck :: Int -> Int -> Bool
primeCheck n i 
    | n == 2 = True
    | i == 1 = True
    | n `mod` i == 0 = False
    | otherwise = primeCheck n (i -1)

isPrime :: Int -> Bool
isPrime n = primeCheck n (floor (sqrt n))

我收到这些错误:

没有 (RealFrac Int) 实例 因使用而产生floor' Possible fix: add an instance declaration for (RealFrac Int) In the second argument ofprimeCheck',即(floor (sqrt n))' In the expression: primeCheck n (floor (sqrt n)) In an equation for是素数': isPrime n = primeCheck n (floor (sqrt n))

No instance for (Floating Int)
  arising from a use of `sqrt'
Possible fix: add an instance declaration for (Floating Int)
In the first argument of `floor', namely `(sqrt n)'
In the second argument of `primeCheck', namely `(floor (sqrt n))'
In the expression: primeCheck n (floor (sqrt n)) Failed, modules loaded: none.

当我将代码更改为以下内容以希望解决问题时:

primeCheck :: Int -> Int -> Bool
primeCheck n i 
    | n == 2 = True
    | i == 1 = True
    | n `mod` i == 0 = False
    | otherwise = primeCheck n (i -1)

isPrime :: Int -> Bool
isPrime n = primeCheck n (floor (RealFrac (sqrt  (Floating n))))

我明白了:

不在范围内:数据构造函数“RealFrac”

不在范围内:数据构造函数“Floating”

我怎样才能解决这个问题?


Floating is a 类型类,不是构造函数或函数。您似乎确实已经发现您需要转换类型n。正确的方法是使用fromIntegral:

isPrime n = primeCheck n $ floor $ sqrt $ (fromIntegral n :: Double)

我们可以通过遵循函数的类型签名来了解为什么这是有效的。

从类型签名isPrime, 我们看n有类型Int.

Since sqrt期望一些Floating类型(即作为类型类实例的类型Floating),我们可以从Int to a Double using fromIntegral。请注意,签名fromIntegral is

(Integral a, Num b) => a -> b

Int是一个实例Integral(所以输入类型没问题)并且Double是一个实例Num所以输出类型没问题。

然后我们采取sqrt得到一个新的Double.

floor需要一个类型为以下实例的参数RealFrac. Double恰好是两者的实例Floating and RealFrac,因此它将完成这项工作(无需转换)。floor将把平方根转换回类型Int.

请注意,由于输出类型为fromIntegral是多态的,就像输入类型一样sqrt and floor,我们必须将转换类型指定为Double,否则编译器不会知道which Num/Floating/RealFrac要转换为的实例。您可能会看到错误ambiguous type 'a' in ....

您可以使用以下命令查看许多函数的类型签名Hoogle

EDIT

事实证明,显式类型签名fromIntegral is not必需的。因此

isPrime n = primeCheck n $ floor $ sqrt $ fromIntegral n

就足够了。在我看来,只提供显式签名会更清楚,但在这种情况下没有必要。您可以阅读更多相关内容here.

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

Haskell“没有实例”错误 的相关文章

  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • Haskell:从后面访问列表

    今天我开始学习Haskell 我对函数式语言有点陌生 而且我非常喜欢 Haskell 然而 我有一个关于它的设计的问题困扰着我 从我到目前为止的理解来看 访问列表后面的元素似乎比访问前面的元素要复杂得多 类似于xs x where xs a
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • 用纯函数式语言保持状态

    我正在尝试弄清楚如何执行以下操作 假设您正在开发直流电机的控制器 您希望让它以用户设置的特定速度旋转 def set point ref sp 90 while true let curr read speed controller set
  • `arr fst` 是如何自然变换的?

    I asked 这个问题 https stackoverflow com q 62733726 11143763不久以前 这是关于以下箭头定律 arr fst first f f arr fst Category k gt k b c gt
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变
  • 加快 GHC 中的编译速度

    除了 O0 这可以加快编译时间吗 如果生成的程序未被优化也没关系 实际上我只想经常快速地对大型 haskell 包进行类型检查 Flag fno code极大地加快了编译速度 但无法使用它 因为该程序使用了 TemplateHaskell
  • Haskell 如何将整数文字转换为不同类型?

    我有以下匿名函数 Exercises gt g Sum n gt Sum n 1 我这样使用它 Exercises gt g Sum 56 Sum getSum 55 Exercises gt g 56 Sum getSum 55 第二个例
  • enumFromTo 如何工作?

    我无法将号码添加到Char 以下内容将无法编译 a 1 但是 a z 成功创建一个字符串 其中每个字符值都会递增 有没有一个特殊的函数可以增加Char 我知道我能做到chr ord c 1 如何 a z 或底层enumFromTo函数增加结
  • 为什么 Kleisli 不是 Monoid 的一个实例?

    如果您希望附加两个类型 a gt m b 的函数 以便只得到一个附加两个结果的相同类型的函数 您可以使用 Kleisli 来执行此操作 instance Monad m Monoid b gt Monoid Kleisli m a b wh
  • 我可以在程序内更改堆栈大小限制吗?

    我可以通过传递配置 GHC 编译的 Haskell 程序的最大堆栈大小 RTS Kn到它 在哪里n是某个数字 有没有办法在程序内更改此设置 我想对各种函数的堆栈消耗进行基准测试 因此尝试在各种限制下运行它 捕获StackOverflow例外
  • Haskell 中的 Monad 和 Purity

    我的问题是 Haskell 中的 monad 是否真正保持了 Haskell 的纯度 如果是的话 又是如何保持的 我经常读到副作用是如何不纯粹的 但有用的程序 例如 I O 需要副作用 下一句指出 Haskell 对此的解决方案是 mona
  • 数据记录的类约束

    我有一个data type data BuildException a KillBuild JobID a Stage FailBuild JobID a Stage CancelBuild JobID a Stage StopBuild
  • 如何编写将布尔值返回到一个函数的函数

    我在这里发现了一个类似的问题 它问了几乎相同的问题 但又不完全一样 我的问题是如何将 a gt Bool 类型的函数列表组合成一个也是 a gt Bool 的函数 Ex compose a gt Bool gt a gt Bool comp
  • 如何在 Haskell 中处理这个简单的 IO 异常

    全部处理 在下面的代码中 getDirectoryContents dir可能会失败 例如dir可能不存在 如何捕获这个并向用户抛出有意义的消息 我知道 IO 异常处理已经被问过很多次了 但我仍然找不到一个简单的方法来做到这一点 walk
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 列出树中叶子的路径

    我正在尝试编写一个函数来查找树中叶子的所有路径 例如 给定一棵如下所示的树 1 2 5 3 4 6 输出列表将是 1 2 3 1 2 4 1 5 6 该函数的类型签名是 branches Tree a gt a 请注意 这使用了中定义的 T
  • 如何查找列表中元素的索引?

    给定列表中的一个元素 我可以使用哪个函数来查找其索引 例如 我想在列表中找到 3 的索引 1 2 3 4 Haskell 中有哪个函数可以用于此目的 看看这里 在 Haskell 中查找列表中元素的索引 https stackoverflo
  • 如何在haskell快速傅里叶变换上应用数据并行?

    我有一个 haskell 代码来解决快速傅里叶变换 并且我想对其应用数据并行性 然而 我使用的每一个策略都会产生太多的火花 而且大多数都溢出了 有谁知道如何在以下算法上应用良好的数据并行策略 radix 2 Cooley Tukey FFT

随机推荐

  • wglext - 扩展未安装在 OpenGL 上下文中

    我正在尝试使用 wglSwapIntervalEXT int Interval 在 OpenGl 中使用 WGL EXT swap control 禁用垂直同步 我试图包含 wglext 标头 但经过多次搜索后 它似乎没有安装在我的电脑上
  • tensorflow retrain.py app.run() 得到意外的关键字参数“argv”

    我正在尝试运行 Tensorflow for Poets 示例 我通过以下内容 python examples image retraining retrain py bottlenext dir tf files bottlenecks
  • 删除 C 中输出末尾的空格

    以下代码用于按螺旋顺序打印矩阵的元素 该程序运行良好 然而 问题是我检查程序的在线编译器不接受输出末尾的尾随空格 谁能给我一些关于如何绕过输出中添加的最后一个空格的想法 作为参考 我的代码如下 是的 变量名称很糟糕 我正在努力改变放置随机变
  • MySql“选择位置”和 C#

    如何从 SelectWhere 语句中读取返回值 每次运行时标签中都没有返回值 也没有语法错误 command CommandText select product price from product where product name
  • 禁用错误的打字稿错误

    我已经使用 jspm 安装了 interact js 以及 npm 以便打字稿满意 该应用程序运行良好 但我的代码显示错误 import interact from interact js interact gt typescript er
  • Android计算Horizo​​ntalScrollView中的scrollTo位置

    我有 Horizo ntalScrollView 和几个 TextView 每个 TextView 可能包含不同长度的文本 我应该如何计算使用 scrollTo x y 滚动到的正确偏移量 滚动有效 但与预期不同 我已经尝试了各种方法 每个
  • 翻译我的主题的 function.php 文件中的自定义标签字段

    在社区的帮助下 我成功创建 保存标签及其值并将其打印到单个产品页面 我还可以使用将输入值翻译成不同的语言Polylang 但是翻译自定义标签 条件和品牌 非常困难 有人可以帮助我解决这些问题吗 我尝试使用Polylang Saywhat 没
  • 用php动态创建zip

    使用 php 创建动态 zip 文件的最简单方法是什么 例如 我在服务器上有这些文件 Root gt Folder 1 gt file1 wav Root gt Folder 2 gt file2 jpg 我想创建一个包含这两个文件的 zi
  • +Android Webview - 如何自动滚动页面?

    我想在网络视图中打开一个html页面 并使其根据通过计时器设置的时间间隔自动向下滚动 虽然下面的示例适用于桌面 但此链接应该让您了解我想要实现的目标 在页面的右上方启用自动滚动 example 首先 我考虑打开一个网页 然后使用某种可以模拟
  • Sed/Awk 删除第二次出现的字符串 - 平台无关

    我正在 bash 中寻找一行既适用于 linux 又适用于 OS X 的行 以删除包含所需字符串的第二行 Header 1 2 Header 10 11 应该成为 Header 1 2 10 11 我的第一次尝试是使用 sed 的删除选项
  • 如何在 Google 地图中设计高尔夫球场(沙丘和果岭)?

    我目前正在使用时髦的地图超轻主题设计我的 Google 地图 人们所期望的造型 景观 影响高尔夫球场 featureType landscape elementType geometry stylers color f5f5f5 light
  • 如何在Azure Blob上实现快速搜索?

    我已完成编写将文件 文本文件 上传到 azure blob 存储的代码 现在我想提供基于文本文件内容的搜索 对于前 如果我搜索 Hello 那么包含 Hello 单词的文件名应该出现在搜索结果中 这是我要搜索的代码 class BlobSe
  • Javascript 到 csv 导出编码问题

    我需要将 javascript 数组导出到 Excel 文件并下载它 我正在这段代码中执行此操作 data 是一个 JavaScript 对象数组 var csvContent data text csv charset utf 8 dat
  • 避免在jetpack compose中的嵌套列中进行重组

    我正在 jetpack compose 中的嵌套列上工作 我有一个列表 其中包含来自服务器的大量数据 我在布局检查器中进行了检查 我发现每当我的项目添加到列表中时 它都会重新组合并增加计数 所以我的疑问是 如果我在列表中一一添加 100 个
  • 在 C# 中将值从一种形式传递到另一种形式

    我必须通过id从 C 中的一种形式到另一种形式 我无法做到这一点 C 代码是 private void btnedit Click object sender EventArgs e foreach DataGridViewRow a in
  • 通过反射确定派生类

    我想处理从类 A 派生的类的方法 类 A 和派生类驻留在不同的程序集中 我使用反射从派生程序集中获取所有 System Type 并迭代它们的方法 Assembly A class Template Assembly B class X A
  • 无法使用 SSH 隧道将 MongoDB Compass 连接到 AWS DocumentDB

    我是 mongoDB 新手 试图为我的新项目设置工具 我的大部分基础设施都在 AWS 上运行 因此我更喜欢使用 AWS documentDB 我设法通过 mongo 客户端或 NodeJS 应用程序从 EC2 连接到 documentDB
  • HTML 文档的 head 元素内可以有 div 标签吗?

    只是想知道是否可以在 head 元素内添加 div 标签 No div 不是位于其中的有效标签标签 因为标签仅适用于元数据 例如标题和页面描述 脚本 样式和其他不打算显示的内容 虽然将其放入有效 这样做很糟糕 你不应该把它放在那里 规范说这
  • Python:从 urllib2.urlopen 调用获取 HTTP 标头?

    Does urllib2当 a 时获取整个页面urlopen已拨打电话 我只想读取 HTTP 响应标头而不获取页面 看起来像urllib2打开 HTTP 连接 然后获取实际的 HTML 页面 或者它只是开始缓冲页面urlopen call
  • Haskell“没有实例”错误

    我正在尝试编写一个函数来检查数字是否为素数 我写了这个 primeCheck Int gt Int gt Bool primeCheck n i n 2 True i 1 True n mod i 0 False otherwise pri