IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

遅延パターンがわからない

以下の例はダメ

main = putStrLn $ unlines $ map show $ f

f = g 0 f
g n (x:xs) = n : g (x + 1) xs

(x:xs) → ~(x:xs) なら OK

main = putStrLn $ unlines $ map show $ f

f = g 0 f
g n ~(x:xs) = n : g (x + 1) xs

その心は

  • 一番最初に (x:xs) のパターン照合を行おうとした時点でまだ f のひとつ目の値が確定していない状態である。
  • つまり、パターン照合してはダメなのである。
  • g が実行されると決まった時点で x は n と確定する。 g が実行されるということが決まらなければ f のひとつ目の値は不定である。
  • つまり、このパターン照合は照合を行わない。照合を行わないで 第二引数 を head と tail に分けるという意味だけを持つ

ということかな?

むずかしすぎるお

常識的に考えて (・ω・;)