37
4

2 に答える 2

37

トリッキーな点が1つあります。それを使用すると、無実のリファクタリングのように見えることを実行すると、プログラムの動作が変わる可能性があります。ベルやホイッスルがなければ、これは次のとおりです。

f h x = h x
isJust (spoon (f undefined)) --> True

しかし、おそらく本の中で最も一般的なhaskell変換、eta収縮を行うとf

f h = h
isJust (spoon (f undefined)) --> False

Etaの収縮は、seq;が存在するため、セマンティクスを保持していません。しかし、スプーンetaの収縮がなければ、終了プログラムをエラーに変えることしかできません。スプーンイータ収縮を使用すると、終了プログラムを別の終了プログラムに変更できます。

正式には、spoon安全でない方法は、ドメイン上で非単調であるということです(したがって、それに関して定義された関数である可能性があります)。一方、spoonすべての機能がない場合は単調です。したがって、技術的には、正式な推論の有用な特性を失います。

これがいつ重要になるかについての実際の例を考え出すことは、読者の演習として残されています(読んでください:あなたがそれを悪用し始めない限りundefined、実際の生活では問題になる可能性は非常に低いと思います;例えばJavaプログラマーの方法を使用して使用null

于 2013-02-05T22:41:37.637 に答える
13

unsafeCoerceそれがあなたが得ているものなら、で書くことはできませんspoon。見た目と同じくらい不健全であり、見た目と同じくらい正確に Haskell のセマンティクスに違反しています。ただし、セグメンテーション違反などを作成するために使用することはできません。

しかし、Haskell のセマンティクスに違反することで、一般的にコードを推論するの難しくなります。また、たとえばwith スプーンは、直接書かれsafeHeadたものよりも必然的に効率が悪くなります。safeHead

于 2013-02-05T16:00:41.183 に答える