我有以下一对整数:
maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), length $ maximum (map collatzList [1..500]))
由于我是新手,我不知道如何使用fromIntegral
或toInteger
将length
转换为整数。我知道长度必须是有限的,但由于“函数”的范围可能很大,我倾向于使用(Integer, Integer)
。
同样,我的问题是 - 如何使用length
或Integer
从Int
将fromIntegral
转换为toInteger
?
答案 0 :(得分:0)
我找到了它:
maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), toInteger $ length $ maximum (map collatzList [1..500]))
只需在长度之前添加toInteger $
。
答案 1 :(得分:0)
有两个问题:首先你的代码没有做你认为它做的事情,其次只是将长度转换为整数是完全无用的......
1)您的代码有误,因为maximum
没有选择最长的列表。 maximum
适用于Ord
个实例,并根据此类型的compare
方法选择最大值。对于Int和Integer,订单可能很明显,但对于列表则不然。订购列表的传统方式是词典顺序(如果您将单词视为字符列表,则在字典中使用):" []< Y:_"和" x:xs< Y:YS" iff x< y或(x == y和xs< ys)。
因此,您的代码只会为您提供以最大数字开头的collatzList,即[500, 250, ...]
。
2)将您的长度转换为Integer
很不错,但为时已晚:如果使用Int
进行计算,则无法恢复正确的值,列表长度(maxBound :: Int) + 1
的计算长度为(minBound :: Int)
,然后此Int
将转换为相同值的Integer
...
您想要的是使用Integer
来直接计算长度Data.List.genericLength
。
那就是说,你真的不需要使用Integer
,特别是如果你使用的是64位GHC(非常可能,请在CLI上查看ghc -e "maxBound :: Int"
) 。对于合理的起始数字,Collatz不会超过64位Int
。
对于maximum
,我建议您调查maximumBy
,comparing
和zip
以获取您想要的代码。