我有以下函数,它将递归地乘以一个数字的数字,直到它达到一个数字
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 产品结果(无论如何我会立即转向字符串显示)?
谢谢
您可以使用
fromIntegral :: Int -> Integer
Run Code Online (Sandbox Code Playgroud)
将 an 提升Int为 an Integer。对于类似的未来问题,您可以使用Hoogle按类型搜索函数,这将为您提供密切相关的答案:
toInteger :: Int -> Integer
Run Code Online (Sandbox Code Playgroud)