与> foreach id (`lsof <file> | awk '{print($2)"'`)
foreach? kill -9 $id
foreach? end
的{{1}}函数是否相反?
如果存在,它是如何实现的以及它用于什么?
答案 0 :(得分:13)
此函数不存在。(假设严格语义)
查看类型的代数,函数类型等价于取幂。
现在,具有absurd
类型的函数Data.Void
对应于等于absurd
的操作Void -> a
。这意味着a ^ 0
只有一个实现,可以在1
中找到。
反转箭头,您会得到absurd
类型,对应Data.Void
或a -> 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,drusba
和absurd
确实是彼此正确的反转,这意味着()
和Void
是同构的。
但是从这一点开始,任何类型A
实际上都与()
和Void
同构,因为只存在一个函数{{ 1}}和() -> A
。
所以基本上,如果存在一个函数A -> ()
,那就意味着Haskell只有一个类型,它不包含任何值。这不是一种特别有用的编程语言,不是吗?
† 当然,如果你忽视⊥,这一切都只有。