- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是编写一个函数来计算低于某个数字“n”的最大 Collatz 数。 (对于熟悉的人来说,这是一个欧拉计划问题。)
一些上下文:给定整数的 Collatz 数等于该整数的 Collatz 序列的长度。整数的 Collatz 序列计算如下:序列中的第一个数字(“n0”)是该整数本身;如果 n0 是偶数,则序列中的下一个数字(“n1”)等于 n/2;如果 n0 是奇数,则 n1 等于 3 * n0 + 1。我们继续递归扩展序列,直到到达 1,此时序列完成。例如,5 的 collatz 序列为:{5, 16, 8, 4, 2, 1}(因为 16 = 3 * 5 + 1, 8 = 16/2, 4 = 8/2,...)
我正在尝试编写一个函数(“maxCollatzUnder”),当传递整数“m”时,它返回具有最长 Collatz 序列(即最大 Collatz 数)的整数(小于或等于 m) 。例如,maxCollatz 20(即低于(含)20 的哪个整数具有最长的拼贴序列?)应返回 19(数字 19 的 Collatz 序列长度为 21:[19,58,29,88,44,22, 11,34,17,52,26,13,40,20,10,5,16,8,4,2,1])。
在下面的代码中,“collatz”和“collatzHelper”函数编译并正确运行。我在使用“maxCollatzUnder”函数时遇到问题。该函数旨在 (I) 为范围从 1 到 m 的每个整数 x 创建一个 2 元组 (x,y) 列表(其中 m 是函数参数),其中 y 表示整数 x 的 Collatz 数,然后 ( II) 在列表中查找最高的 Collatz 数(即 y)并返回其关联的整数(即 x)
maxCollatzUnder n = foldl(\acc (i,j) -> if j > acc then i else acc) 0
(zip [1..n] ( map collatzLength [1..n]))
where collatzLength n = length . collatz $ n
collatz n = map truncate $ collatzHelper n
collatzHelper 0 = [0]
collatzHelper 1 = [1]
collatzHelper n
| (truncate n) `mod` 2 == 0 = [n] ++ collatzHelper (n/2)
| otherwise = [n] ++ collatzHelper (3*n+1)
当我(尝试)编译时,出现以下错误。
*Main> :l PE14Collatz.hs
[1 of 1] Compiling Main ( PE14Collatz.hs, interpreted )
PE14Collatz.hs:7:89:
No instance for (RealFrac Int)
arising from a use of `collatzLength'
In the first argument of `map', namely `collatzLength'
In the second argument of `zip', namely
`(map collatzLength [1 .. n])'
In the third argument of `foldl', namely
`(zip [1 .. n] (map collatzLength [1 .. n]))'
Failed, modules loaded: none.
令人好奇的是,如果我将“maxCollatzUnder”更改为以下代码(见下文),代码会正确编译并运行。唯一的变化是,在下面的版本中,fold 函数返回“j”(即最大的 Collatz 数)而不是“i”(即生成最大 Collatz 数的整数)。
maxCollatzUnder n = foldl(\acc (i,j) -> if j > acc then j else acc) 0
(zip [1..n] ( map collatzLength [1..n]))
where collatzLength n = length . collatz $ n
尽管我仍然有兴趣了解此错误的原因,但欢迎提出更有效/优雅的方法的建议。
最佳答案
因为您使用truncate
( RealFrac
的方法)和 /
( Fractional
的方法, RealFrac
的父类(super class)),Haskell 为您的最后两个函数推断出以下两个类型签名:
collatz :: (RealFrac a, Integral b) => a -> [b]
collatzHelper :: RealFrac a => a -> [a]
Haskell 然后尝试推断 maxCollatzUnder
的类型,其思考过程是这样的:
“在 collatzLength n = length . collatz $ n
中,我们将 n
传递给 collatz
,因此 collatzLength
的参数必须是 RealFrac
。”
“因此,在 map collatzLength [1..n]
中,[1..n]
必须是 RealFrac
值的列表。”
“因此,n
中的map collatzLength [1..n]
必定是RealFrac
类型。”
“因此, n
中的 zip [1..n]
(与 n
相同)必须是 RealFrac
类型,因此 [1..n]
是 RealFrac
的列表。”
“因此, i
中的 (\acc (i,j) -> if j > acc then i else acc)
必定是 RealFrac
。”
“由于上述 lambda 可以返回 i
或 acc
,因此它们必须是同一类型。”
“因为 j
正在与 acc
进行比较,所以 j
必须与 acc
具有相同的类型 - 因此与 i
和 RealFrac
具有相同的类型。”
“但是等等 - j
是 collatzLength
的返回值,它是调用 length
的返回值,因此它必须是 Int
,但是Int
不在 RealFrac
中!”
“错误!错误!”
我现在必须走了(编译器 cabal 不喜欢我泄露他们的 secret ),但最短的解决办法是不使用 truncate
和/
只需使用 div
用于(取整)整数除法。
关于Haskell初学者: "No instance for...arising from..." error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26153406/
我知道我的问题有点含糊,但我不知道如何描述它。我问过很多地方,但似乎没有人理解我为什么要这样做。但请耐心等待,我会解释为什么我想要这样的东西。 我使用 Liquid Templates 允许用户在我的
这个问题在这里已经有了答案: what is the difference between null != object and object!=null [duplicate] (2 个回答) 7年
当我在我的本地主机 Google App Engine 应用程序中将日志记录级别更改为 FINE 时,我开始在我的跟踪堆栈中看到这些: Apr 17, 2013 4:54:20 PM com.goog
Python 有内置函数 type : class type(object) With one argument, return the type of an object. The return v
我正在使用深度学习进行语义分割,我遇到了以下术语:语义分割、实例检测、对象检测 和对象分割. 它们有什么区别? 最佳答案 这些术语的某些用法对用户而言是主观的或依赖于上下文,但据我所知对这些术语的合理
我面临 -[NSConcreteMutableData release] 的问题:消息发送到已释放的实例,我也附上了我的示例代码。 - (IBAction)uploadImage { NSString
我试图显示模型中的单个实例(数据库行),其中多个实例共享多行的相同字段(列)值。为了澄清这一说法,我有以下情况: ID/Title/Slug/Modified 1 Car A 1s ag
我正在尝试使用mockito来模拟服务。然而,我没有找到一种方法来告诉mockito,给定一个类的实例返回给我相同的实例: 类似于: given(service.add(any(Individua
我知道如何从父类(super class)原型(prototype)创建子类原型(prototype)。但是,如果我已经有了父类(super class)对象的实例来创建子类对象怎么办? 在 JS 中
鉴于 Kotlin 1.1。对于某个类的 instance,instance::class.java 和 instance.javaClass 似乎几乎是等价的: val i = 0 println(
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Find out the instance id from within an ec2 machine 我正在寻找从
为什么我的 Instantiate 函数没有创建 That 的“空白”实例? 我有以下最小类: classdef That < handle properties This = '' end
Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTra
考虑以下几点: public class A { public String name = "i am a A instance"; } public class B extends A {
我正在使用 Scalr 来扩展网站服务器。 在 Apache 服务器上,我安装了 Sakai,并为 Linux 机器创建了一个启动脚本。 问题是,如何确保MySQL实例在Apache服务器启动之前启动
Android Realm DB 允许使用 Realm.getInstance() 获取多个实例。这些中的最佳实践是什么? :1.创建单个实例(应用程序范围)并在任何地方使用它2. 在需要时获取一个新
我很难理解为什么修改实例 a 中的属性会修改实例 b 中的相同属性。 var A = function (){ }; A.prototype.data = { value : 0 }; var
我将 Weka 用作更长管道的一部分,因此,我无法承受将所有数据写入文件或数据库只是为了创建一个 Instances。目的。我可以即时做的是创建 Instance 的列表对象。 来自 this pag
class C: def func(self, a): print(a) c = C() print(c.__dict__) # {} c.func = c.func # c.func i
Angular Routing 文档提到了组件实例创建、组件实例激活和路由激活。 文档没有解释这些概念的区别,以及每次创建/激活发生的时间。 问题 实例创建和实例激活有什么区别? 实例激活和路由激活有
我是一名优秀的程序员,十分优秀!