このコード行を考えると(この回答で最初に見た):
pVal :: Num a => a
pVal = sum . map fromIntegral $ ([1..10000000] :: [Int])
複数の型として使用される場合、式は型ごとに完全に再評価されますか? タイプごとに 1 つの結果が保持されますか?
例えば:
pInt :: Int
pInt = pVal
pDub :: Double
pDub = pVal
このコード行を考えると(この回答で最初に見た):
pVal :: Num a => a
pVal = sum . map fromIntegral $ ([1..10000000] :: [Int])
複数の型として使用される場合、式は型ごとに完全に再評価されますか? タイプごとに 1 つの結果が保持されますか?
例えば:
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
2 回目に「評価中...」がないことに注意してください。
> pInt
evaluating...
50005000
> pInt
50005000