Haskell 长度到整数的转换

Haskell length toInteger Conversion

我有以下一对整数:

maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), length $ maximum (map collatzList [1..500]))

由于我是新手,我不知道如何使用fromIntegraltoIntegerlength转换为整数。我知道长度一定是有限的,但由于 "function" 的范围可能很大,我倾向于使用 (Integer, Integer)

同样,我的问题是 - 如何使用 fromIntegraltoIntegerlengthInt 转换为 Integer

我找到了:

maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), toInteger $ length $ maximum (map collatzList [1..500]))

只要在长度前加上toInteger $即可。

有两个问题:首先你的代码没有按照你的想法去做,其次只是将长度转换为整数是完全没用的...

1) 您的代码有误,因为 maximum 不是 select 最长的列表。根据此类型的 compare 方法,maximumOrd 个实例和 select 最大。对于 Int 和 Integer,顺序可能很明显,但对于列表则不然。排序列表的传统方法是字典顺序(如果您将单词视为字符列表,则在词典中使用):“[] < y:_” 和 "x:xs < y:ys" iff x < y or (x == y 和 xs < ys).

因此您的代码将简单地为您提供以最大数字开头的 collat​​zList,即 [500, 250, ...]

2) 将你的长度转换为 Integer 很好,但为时已晚:如果它是用 Int 计算的,它不会恢复正确的值,一个长度列表 (maxBound :: Int) + 1 将获得 (minBound :: Int) 的计算长度,然后此 Int 将转换为具有相同值的 Integer...

你想要的是直接用 Integers 计算长度,你可以用 Data.List.genericLength.


就是说,您真的不需要使用 Integer,尤其是如果您使用的是 64 位 GHC(很可能,请在 CLI 上检查 ghc -e "maxBound :: Int")。对于合理的起始数字,Collat​​z 不会超过 64 位 Int

至于 maximum,我建议您调查 maximumBycomparingzip 以获得您想要的代码。