Haskellは遅延評価を特徴とする言語ですが、seq関数や!パターンを使うことで正格評価をさせることもできます。 ただし、最終的な値まで完全に評価(deepseq)されるわけではなく、WHNF(Week Head Normal Form)に簡約されるまでの評価です。 WHNFとは、簡単にいうと、以下のいずれかの形をもつ式です。 プリミティブである 式の一番左にデータコンストラクタがある 式の一番左にλがある 正格評価を使ったときにコードの挙動がどう変わるのか、具体的には以下のようになります。 ケース1(遅延評価)$ cat case1.hs loop 0 i = i loop n i = loop (n-1) (i+1) n = 100000000 main = let x = loop n 0 in putStrLn "1" $ ghc --make -O case1.hs $ tim
![【まとめ】Haskellでの正格評価とWHNF](https://cdn-ak-scissors.b.st-hatena.com/image/square/347b3c8390bbfda5bb702c429d2c23e5bfb1bb25/height=288;version=1;width=512/http%3A%2F%2F3.bp.blogspot.com%2F-sG9a1oWaaPI%2FTbbF4w-L4vI%2FAAAAAAAAATQ%2FIYWSnHpVWCM%2Fw1200-h630-p-k-no-nu%2Fhaskell.png)