今日はInverse of the absurd functionが見えましたが、drusba :: a -> Void
の実装は決して終了しません(結局、Void
を構築することは不可能です)。なぜ同じことがabsurd :: Void -> a
でないのか分かりません。 GHCの実装を考えてみましょう: どうData.Void.absurdは⊥と異なっているのですか?
newtype Void = Void Void
absurd :: Void -> a
absurd a = a `seq` spin a where
spin (Void b) = spin b
spin
Void
のnewtypeラッパーの無限級数を解明されているようだ、とあなたはそれを渡すために
Void
を見つけることができる場合であっても戻らないだろう。区別できない実装はのようになります。
ことを考えると
absurd :: Void -> a
absurd a = a `seq` undefined
、なぜ我々はabsurd
がData.Voidに住むに値する適切な機能であると言うが、
drusba :: a -> Void
drusba = undefined
はAですかおそらく定義できない関数ですか?それは次のようなものですか?そのドメイン
absurd
drusba
は、一部の底結果を与え、部分的であるのに対し、その(空の)ドメイン内の任意の入力のための非底結果を与え、合計関数である(実際にはすべての)入力。
底を塞ぐと、不合理な機能が呼び出されることはありません。これはめったに必要ありませんが、用途があります。 – augustss