以下の例はダメ
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 に分けるという意味だけを持つ
ということかな?
むずかしすぎるお
常識的に考えて (・ω・;)