2 に答える
トリッキーな点が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
)
unsafeCoerce
それがあなたが得ているものなら、で書くことはできませんspoon
。見た目と同じくらい不健全であり、見た目と同じくらい正確に Haskell のセマンティクスに違反しています。ただし、セグメンテーション違反などを作成するために使用することはできません。
しかし、Haskell のセマンティクスに違反することで、一般的にコードを推論するのが難しくなります。また、たとえばwith スプーンは、直接書かれsafeHead
たものよりも必然的に効率が悪くなります。safeHead