ここの半分まで...
https://en.wikibooks.org/wiki/Haskell/Laziness
head
...反論の余地のないパターンを使用する関数の代替実装への変更の影響について尋ねる演習です。次のようにの定義を提供しますが、最初の方程式の反駁できない一致によりhead'
常に返されることに注意してください。undefined
head' :: [a] -> a
head' ~[] = undefined
head' ~(x:xs) = x
次に、次のように尋ねます。
head'
ここで役立つように方程式の順序を変更しないのはなぜですか?- 最初の方程式が通常の反駁可能なパターンを使用するように変更された場合、 の動作は の動作とは
head'
異なりhead
ますか? もしそうなら、どのように?
GHC 7.8.4 では、順序を変更すると、少なくともこの関数が の通常の部分バージョンのように動作する程度までは「役立つ」ように見えますhead
が、空のリストの場合は別の例外があります。2 番目の質問に対する答えは「いいえ」のように見えますが、「もしそうなら、どのように」という補遺を考えると、ここでも何かが欠けているように感じます。誰でも私を啓発できますか?残念ながら、このページのソリューション リンクでは、この演習はカバーされていません。