Haskell长度为整数转换

时间:2015-05-24 13:26:51

标签: haskell integer int type-conversion tuples

我有以下一对整数:

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

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

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

2 个答案:

答案 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)。

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

2)将您的长度转换为Integer很不错,但为时已晚:如果使用Int进行计算,则无法恢复正确的值,列表长度(maxBound :: Int) + 1的计算长度为(minBound :: Int),然后此Int将转换为相同值的Integer ...

您想要的是使用Integer来直接计算长度Data.List.genericLength

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

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