gpt4 book ai didi

haskell - 交互式和编译的 Haskell 之间的不同结果(Project Euler 20)

转载 作者:行者123 更新时间:2023-12-03 15:03:12 24 4
gpt4 key购买 nike

我在 Project Euler 上做问题 20 - 找到 100 的数字之和! (因素,而不是热情)。

这是我写的程序:

import Data.Char

main = print $ sumOfDigits (product [1..100])

sumOfDigits :: Int -> Int
sumOfDigits n = sum $ map digitToInt (show n)

我用 ghc -o p20 p20.hs 编译它并执行它,只得到 0在我的命令行上。

不解,我调用了 ghci并运行以下行:
sum $ map Data.Char.digitToInt (show (product [1..100]))
这返回了正确的答案。为什么编译的版本不起作用?

最佳答案

原因是类型签名

sumOfDigits :: Int -> Int
sumOfDigits n = sum $ map digitToInt (show n)

利用
sumOfDigits :: Integer -> Int

你会得到和 GHCi 一样的东西(你想要的)。
Int是机器字大小“整数”的类型,而 Integer是数学上正确的任意精度的类型 Integers .

如果你输入
:t product [1..100]

进入 GHCi 你会得到类似的东西
product [1..100] :: (Enum a, Num a) => a

也就是说,对于任何具有 Enum 和 Num 类型类实例的类型, product [1..100]可能是该类型的值
product [1..100] :: Integer

should return 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 which is far bigger than your machine is likely to be able to represent as a word on your machine.可能是因为翻车
product [1..100] :: Int

将返回 0

鉴于此,您可能会认为
sum $ map Data.Char.digitToInt (show (product [1..100]))

不会进行类型检查,因为它有多种可能的不兼容解释。但是,为了可以用作计算器,Haskell 默认使用 Integer在这种情况下,从而解释你的行为。

出于同样的原因,如果你没有给出 sumOfDigits一个明确的类型签名它会做你想要的,因为最通用的类​​型是
sumOfDigits :: Show a => a -> Int

关于haskell - 交互式和编译的 Haskell 之间的不同结果(Project Euler 20),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11174184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com