3

鉴于这行代码(我第一次在这个答案中看到):

pVal :: Num a => a
pVal = sum . map fromIntegral $ ([1..10000000] :: [Int])

如果它被用作多种类型,是否为每种类型完全重新评估表达式?是否保留了每种类型的一个结果?

例如:

pInt :: Int
pInt = pVal

pDub :: Double
pDub = pVal
4

1 回答 1

12

从技术上讲,Haskell 标准没有具体说明。在实践中,它每次都会重新评估。您可以使用以下方法自行验证Debug.Trace

import Debug.Trace (trace)

pVal :: Num a => a
pVal = trace "evaluating..." $ sum . map fromIntegral $ ([1..10000] :: [Int])

在 GHCi 中尝试:

> pVal :: Int
evaluating...
50005000
> pVal :: Int
evaluating...
50005000

但是,将此值绑定到具体类型将允许它被重用。

pInt :: Int
pInt = pVal

请注意,第二次没有“评估...”:

> pInt
evaluating...
50005000
> pInt
50005000
于 2012-10-05T12:56:24.083 回答