鉴于这行代码(我在this answer中首次看到):
pVal :: Num a => a
pVal = sum . map fromIntegral $ ([1..10000000] :: [Int])
如果它被用作多种类型,那么每个类型的表达式是否完全重新评估?每种类型都有一个结果吗?
例如:
pInt :: Int
pInt = pVal
pDub :: Double
pDub = pVal
答案 0 :(得分: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