Haskell 长度到整数的转换
Haskell length toInteger Conversion
我有以下一对整数:
maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), length $ maximum (map collatzList [1..500]))
由于我是新手,我不知道如何使用fromIntegral
或toInteger
将length
转换为整数。我知道长度一定是有限的,但由于 "function" 的范围可能很大,我倾向于使用 (Integer, Integer)
。
同样,我的问题是 - 如何使用 fromIntegral
或 toInteger
将 length
从 Int
转换为 Integer
?
我找到了:
maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), toInteger $ length $ maximum (map collatzList [1..500]))
只要在长度前加上toInteger $
即可。
有两个问题:首先你的代码没有按照你的想法去做,其次只是将长度转换为整数是完全没用的...
1) 您的代码有误,因为 maximum
不是 select 最长的列表。根据此类型的 compare
方法,maximum
与 Ord
个实例和 select 最大。对于 Int 和 Integer,顺序可能很明显,但对于列表则不然。排序列表的传统方法是字典顺序(如果您将单词视为字符列表,则在词典中使用):“[] < y:_” 和 "x:xs < y:ys" iff x < y or (x == y 和 xs < ys).
因此您的代码将简单地为您提供以最大数字开头的 collatzList,即 [500, 250, ...]
。
2) 将你的长度转换为 Integer
很好,但为时已晚:如果它是用 Int
计算的,它不会恢复正确的值,一个长度列表 (maxBound :: Int) + 1
将获得 (minBound :: Int)
的计算长度,然后此 Int
将转换为具有相同值的 Integer
...
你想要的是直接用 Integer
s 计算长度,你可以用 Data.List.genericLength
.
就是说,您真的不需要使用 Integer
,尤其是如果您使用的是 64 位 GHC(很可能,请在 CLI 上检查 ghc -e "maxBound :: Int"
)。对于合理的起始数字,Collatz 不会超过 64 位 Int
。
至于 maximum
,我建议您调查 maximumBy
、comparing
和 zip
以获得您想要的代码。
我有以下一对整数:
maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), length $ maximum (map collatzList [1..500]))
由于我是新手,我不知道如何使用fromIntegral
或toInteger
将length
转换为整数。我知道长度一定是有限的,但由于 "function" 的范围可能很大,我倾向于使用 (Integer, Integer)
。
同样,我的问题是 - 如何使用 fromIntegral
或 toInteger
将 length
从 Int
转换为 Integer
?
我找到了:
maxCollatz :: (Integer, Integer)
maxCollatz = (head $ maximum (map collatzList [1..500]), toInteger $ length $ maximum (map collatzList [1..500]))
只要在长度前加上toInteger $
即可。
有两个问题:首先你的代码没有按照你的想法去做,其次只是将长度转换为整数是完全没用的...
1) 您的代码有误,因为 maximum
不是 select 最长的列表。根据此类型的 compare
方法,maximum
与 Ord
个实例和 select 最大。对于 Int 和 Integer,顺序可能很明显,但对于列表则不然。排序列表的传统方法是字典顺序(如果您将单词视为字符列表,则在词典中使用):“[] < y:_” 和 "x:xs < y:ys" iff x < y or (x == y 和 xs < ys).
因此您的代码将简单地为您提供以最大数字开头的 collatzList,即 [500, 250, ...]
。
2) 将你的长度转换为 Integer
很好,但为时已晚:如果它是用 Int
计算的,它不会恢复正确的值,一个长度列表 (maxBound :: Int) + 1
将获得 (minBound :: Int)
的计算长度,然后此 Int
将转换为具有相同值的 Integer
...
你想要的是直接用 Integer
s 计算长度,你可以用 Data.List.genericLength
.
就是说,您真的不需要使用 Integer
,尤其是如果您使用的是 64 位 GHC(很可能,请在 CLI 上检查 ghc -e "maxBound :: Int"
)。对于合理的起始数字,Collatz 不会超过 64 位 Int
。
至于 maximum
,我建议您调查 maximumBy
、comparing
和 zip
以获得您想要的代码。