2

ここの半分まで...

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 番目の質問に対する答えは「いいえ」のように見えますが、「もしそうなら、どのように」という補遺を考えると、ここでも何かが欠けているように感じます。誰でも私を啓発できますか?残念ながら、このページのソリューション リンクでは、この演習はカバーされていません。

4

1 に答える 1

7

ウィキブックの「ヘルプ」が何を意味するのかわかりません。順序を変更すると、基本的に通常のように動作することは間違いありませんhead。同様に、最初のパターンを反駁可能にすると、 のように動作することも正しいですhead。これらの質問は混乱しています。彼らは間違いなく混乱しています。

これらの答えは、計算 (GHC を使用した計算を含む) によって検証できます。

head [] = ⊥
head (x:xs) = x
head ⊥ = ⊥

head' [] = ⊥
head' (x:xs) = ⊥
head' ⊥ = ⊥

head1 [] = ⊥
head1 (x:xs) = x
head1 ⊥ = ⊥

head2 [] = ⊥
head2 (x:xs) = x
head2 ⊥ = ⊥

head標準ライブラリのバージョンです。head'ウィキブックからのバージョンです。head1節が入れ替わったバージョンです。head2は、最初のパターンが に対する反駁可能な一致であるバージョン[]です。⊥ は「底」として読まれ、非終了または例外的な計算を表しundefinedます。

私が期待していたのは、次のような例で、反駁できるパターンと反駁できないパターンの間に微妙ではあるが重要な違いがある場合です。

konst ~() = ()

konst' () = ()

partialId ~(x:xs) = x:xs

partialId' (x:xs) = x:xs
于 2016-03-02T01:45:13.330 に答える