我有以下代码:
{-# NOINLINE i2i #-}
i2i :: Int -> Integer
i2i x = toInteger x
main = print $ i2i 2
Run Code Online (Sandbox Code Playgroud)
使用-ddump-simpl标志运行GHC可以:
[Arity 1
NoCafRefs
Str: DmdType U(L)]
Main.i2i = GHC.Real.toInteger1
Run Code Online (Sandbox Code Playgroud)
似乎从Int到Integer的转换是懒惰的.为什么会这样 - 我有什么可以的
(toInteger _|_ ::Int) /= _|_
Run Code Online (Sandbox Code Playgroud)
?
编辑:这个问题与GHC严格性分析器有关,而不是与懒惰本身有关.此代码源于探索标准均值函数:
--mean :: Integer -> Integer -> [Integer] -> Double
mean :: Integer -> Int -> [Integer] -> Double
mean acc n [] = fromIntegral acc / fromIntegral n
mean acc n (x:xs) = mean (acc + x) (n + …Run Code Online (Sandbox Code Playgroud)