颠倒荒谬的功能

Thr*_*eFx 6 haskell category-theory

是否与absurd函数相反Data.Void

如果它存在,它是如何实现的以及它用于什么?

Thr*_*eFx 13

此功能不存在.(假设严格的语义)

查看类型的代数,函数类型等效于取幂.

现在函数absurd,其类型Void -> a对应于a ^ 0等于的操作1.这意味着只有一个实现absurd,可以在其中找到Data.Void.

反转箭头,您将获得a -> Void0 ^ a或相对应的类型0,这意味着不存在所需的功能.


你也可以用Curry-Howard同构来证明这一点.由于函数类型对应于布尔函数'implies',因此您将获得以下术语:

True -> False
Run Code Online (Sandbox Code Playgroud)

这是假的,因此不a -> Void存在任何功能.

由于我刚开始学习类别理论,因此鼓励由于语言不精确而进行更正.


Phi*_* JF 7

这取决于你的意思.absurd见证同构的一面,Void = forall a.a从那个观点看,有一个反面

void :: (forall a.a) -> Void
void x = x
Run Code Online (Sandbox Code Playgroud)

这实际上是一种同构.

该类型没有总功能

 forall a.a -> Void
Run Code Online (Sandbox Code Playgroud)

absurd在部分函数中也没有与该类型相反.


lef*_*out 6

很直观地说,这个功能不可能存在.说我们有这样一个功能:

drusba :: a -> Void
Run Code Online (Sandbox Code Playgroud)

那么你可以做到

GHCi> drusba (5 :: Int)
Run Code Online (Sandbox Code Playgroud)

......从而创造出类型的价值Void.嗯,那令人兴奋......还有,恭喜你,你死了!

Hask(Haskell类型的类别,Haskell函数作为态射)是具有初始对象bicartesian封闭类.初始对象的定义是,对于任何类型,只存在一个函数- 这些函数是实例.双重地,只存在一个函数,因为它是终端对象 - 任何这样的函数都等价于. VoidAVoid -> Aabsurd :: Void -> aB -> ()()const ()

现在,假设drusba :: () -> Void,我们会

drusba . absurd :: Void -> Void
drusba . absurd ? id
Run Code Online (Sandbox Code Playgroud)

因为只能有一个功能Void -> Void,我们知道id是一个功能; 和

absurd . drusba :: () -> ()
absurd . drusba ? id
Run Code Online (Sandbox Code Playgroud)

出于同样的原因.IOW,drusba并且absurd确实是彼此正确的反转,这意味着()并且Void是同构的.

但是从这个它会遵循任何类型A实际上是同构既()Void,因为那里将存在恰好一个功能() -> AA -> ().

所以基本上,如果存在一个函数drusba :: a -> Void,那就意味着Haskell只有一个类型,它不包含任何值.那不是一种特别有用的编程语言,不是吗?


当然,如果你忽视⊥,这一切都只有.