在与此问题中显示的问题类似的问题中,是否有可能具有“通用”类型 a 的 Haskell 表达式?就像是,
myExpression :: a
我是 Haskell 的新手,但从我所看到的情况来看,这是无法实现的。
在与此问题中显示的问题类似的问题中,是否有可能具有“通用”类型 a 的 Haskell 表达式?就像是,
myExpression :: a
我是 Haskell 的新手,但从我所看到的情况来看,这是无法实现的。
不,除了底部之外,没有什么可以满足的,例如
myExpression = myExpression
-- or,
myExpression = undefined
有什么合理的方法可以实现吗?Integer
一些既是 an又是类型的非底部表达式Maybe (String -> IO ())
(例如)。
此外,鉴于您提到的问题,其中一个答案证明了唯一具有类型签名的非底部函数a -> a
是id
,我们有一个证明不能有非底部表达式类型a
。如果有,那么
f _ = myExpression
可以有 type a -> a
,这既不是id
也不是底部,即矛盾。
您可以将该类型签名读作“对于所有类型a, myExpression 属于a类型”。这意味着 myExpression 必须是所有类型中都存在的某个值。
从数学上讲,不存在这样的值,因为a可能是“獾”或“不是獾的东西”,这两个集合必然是不同的。
在 Haskell 类型系统中,myExpression 的唯一有效值是undefined,也就是底部。
虽然抽象地只有一个值的类型为“a”,但在运行时有多种可能的解释。
myExpression = myExpression
这永远不会终止。
myExpression = undefined
这将(使用 GHC 时)打印“ * Exception: Prelude.undefined”
myExpression = error "Hello!
这将打印“ * Exception: Hello!”
myExpression = unsafePerformIO (launchNukes >> fail "BOOM")
这个版本的底部的行为取决于你导入了哪些库。
由于您询问“通用”类型,因此您可能指的是可以有用地包含任何值的事物的类型。在这种情况下,请查看Data.Dynamic,它允许您将任何具有内存表示的内容转换为“动态”类型的值。稍后,当使用“动态”类型的值时,您可以尝试将其转换为更具体的类型,您可以实际使用它来做一些有用的事情。