颠倒荒谬的功能

时间:2016-07-24 15:22:44

标签: haskell category-theory

> foreach id (`lsof <file> | awk '{print($2)"'`) foreach? kill -9 $id foreach? end 的{​​{1}}函数是否相反?

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

3 个答案:

答案 0 :(得分:13)

此函数不存在。(假设严格语义)

查看类型的代数,函数类型等价于取幂。

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

反转箭头,您会得到absurd类型,对应Data.Voida -> Void,这意味着所需的功能不存在。

你也可以使用Curry-Howard同构来证明这一点。由于函数类型对应于布尔函数&#39;暗示&#39;,因此您得到以下术语:

0 ^ a

这是假的,因此不存在函数0

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

答案 1 :(得分:7)

这取决于你的意思。 absurd见证了同构Void = forall a.a的一面,并从该视图中看到了反转

void :: (forall a.a) -> Void
void x = x

这实际上是一种同构。

没有类型的总函数

 forall a.a -> Void

在部分函数中与该类型的absurd相反。

答案 2 :(得分:6)

非常直观地说,该功能不可能存在。假设我们有这样的功能:

drusba :: a -> Void

然后你可以做

GHCi> drusba (5 :: Int)

...从而创建Void类型的值。 Well, that's exciting... also, congratulations, you're dead!

Hask (Haskell类型的类别,Haskell函数为态射)是bicartesian closed category initial object Void。初始对象的定义是,对于任何类型A,只存在一个函数Void -> A - 这些函数是absurd :: Void -> a的实例化。双重地,只存在一个函数B -> (),因为()是终端对象 - 任何此类函数都等同于const ()

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

drusba . absurd :: Void -> Void
drusba . absurd ≡ id

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

absurd . drusba :: () -> ()
absurd . drusba ≡ id

出于同样的原因。 IOW,drusbaabsurd确实是彼此正确的反转,这意味着()Void是同构的。

但是从这一点开始,任何类型A实际上都与()Void同构,因为只存在一个函数{{ 1}}和() -> A

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

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