我今天早些时候看到了荒谬功能的逆向,虽然我很清楚,任何可能的实现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
Run Code Online (Sandbox Code Playgroud)
spin在我看来,它无休止地解开了无限系列的Void新型包装器,即使你能找到Void传递它也永远不会返回.无法区分的实现类似于:
absurd :: Void -> a
absurd a = a `seq` undefined
Run Code Online (Sandbox Code Playgroud)
鉴于此,为什么我们说这absurd是一个值得生活在Data.Void中的适当函数,但是
drusba :: a -> Void
drusba = undefined
Run Code Online (Sandbox Code Playgroud)
是一个不可能定义的函数?它是否像以下那样?
absurd是一个总函数,为其(空)域中的任何输入提供非底部结果,而drusba为部分,给出其域中某些(实际上所有)输入的最低结果.
在一些Haskell代码中,我遇到了:
put :: s -> m ()
Run Code Online (Sandbox Code Playgroud)
这()意味着什么?
我使用搜索引擎,但找不到()正确处理的搜索引擎.
haskell ×2