Haskell 函数中的整数与整数问题

Κωσ*_*ρης 0 haskell

我有以下函数,它将递归地乘以一个数字的数字,直到它达到一个数字

multResWithCounter' :: (Int, [Int],[Integer]) -> (Int, [Int],[Integer])
multResWithCounter' (counter, listOfDigits,listOfProducts)
   | (length listOfDigits) <= 1 = (counter, listOfDigits, listOfProducts)
   | otherwise = multResWithCounter' ((counter + 1), newListOfDigits, digitProduct:listOfProducts)
   where newListOfDigits = map (\n -> read [n] :: Int) (show $ digitProduct)
         digitProduct = ((product listOfDigits) :: Integer)
Run Code Online (Sandbox Code Playgroud)

这当然不能在 ghci 中编译,抱怨它无法将预期类型的​​ Integer 与实际类型的 Int 匹配。如果我退缩并将类型声明更改为 Int 并调用它,例如,

multResWithCounter' (0,[2,7,7,7,7,7,7,8,8,8,8,8,8,9,9],[])
Run Code Online (Sandbox Code Playgroud)

我得到

(2,[0],[0,1191706624])
Run Code Online (Sandbox Code Playgroud)

现在这个“1191706624”当然是结果

(product [2,7,7,7,7,7,7,8,8,8,8,8,8,9,9]) `mod` (maxBound :: Int)
Run Code Online (Sandbox Code Playgroud)

果然第一部分在ghci中直接运行的结果是正确的4996238671872。

那么,我怎样才能让 Haskell 给我 Integer 产品结果(无论如何我会立即转向字符串显示)?

谢谢

Dan*_*ner 5

您可以使用

fromIntegral :: Int -> Integer
Run Code Online (Sandbox Code Playgroud)

将 an 提升Int为 an Integer。对于类似的未来问题,您可以使用Hoogle按类型搜索函数,这将为您提供密切相关的答案:

toInteger :: Int -> Integer
Run Code Online (Sandbox Code Playgroud)