Я видел обратную абсурдную функцию ранее, и хотя мне ясно, что любая возможная реализация drusba :: a -> Void
никогда не закончится (в конце концов, это невозможно для построения Void
), я не понимаю, почему то же самое не относится к absurd :: Void -> a
. Рассмотрим реализацию GHC:
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
- функция, которая не может быть определена? Это что-то вроде следующего?
absurd
- это полная функция, дающая не-нижний результат для любого ввода в его (пустой) области, тогда какdrusba
является частичным, давая нижние результаты для некоторых (действительно всех) входов в его домене.