鉴于这行代码(我第一次在这个答案中看到):
pVal :: Num a => a
pVal = sum . map fromIntegral $ ([1..10000000] :: [Int])
如果它被用作多种类型,是否为每种类型完全重新评估表达式?是否保留了每种类型的一个结果?
例如:
pInt :: Int
pInt = pVal
pDub :: Double
pDub = pVal
鉴于这行代码(我第一次在这个答案中看到):
pVal :: Num a => a
pVal = sum . map fromIntegral $ ([1..10000000] :: [Int])
如果它被用作多种类型,是否为每种类型完全重新评估表达式?是否保留了每种类型的一个结果?
例如:
pInt :: Int
pInt = pVal
pDub :: Double
pDub = pVal
从技术上讲,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