0

在与此问题中显示的问题类似的问题中,是否有可能具有“通用”类型 a 的 Haskell 表达式?就像是,

myExpression :: a

我是 Haskell 的新手,但从我所看到的情况来看,这是无法实现的。

4

3 回答 3

7

不,除了底部之外,没有什么可以满足的,例如

myExpression = myExpression

-- or,

myExpression = undefined

有什么合理的方法可以实现吗?Integer一些既是 an又是类型的非底部表达式Maybe (String -> IO ())(例如)。


此外,鉴于您提到的问题,其中一个答案证明了唯一具有类型签名的非底部函数a -> aid,我们有一个证明不能有非底部表达式类型a。如果有,那么

f _ = myExpression

可以有 type a -> a,这既不是id也不是底部,即矛盾。

于 2012-09-01T21:36:25.440 回答
1

您可以将该类型签名读作“对于所有类型a, myExpression 属于a类型”。这意味着 myExpression 必须是所有类型中都存在的某个值。

从数学上讲,不存在这样的值,因为a可能是“獾”或“不是獾的东西”,这两个集合必然是不同的。

在 Haskell 类型系统中,myExpression 的唯一有效值是undefined,也就是底部。

于 2012-09-02T05:38:35.737 回答
1

虽然抽象地只有一个值的类型为“a”,但在运行时有多种可能的解释。

myExpression = myExpression

这永远不会终止。

myExpression = undefined

这将(使用 GHC 时)打印“ * Exception: Prelude.undefined”

myExpression = error "Hello!

这将打印“ * Exception: Hello!”

myExpression = unsafePerformIO (launchNukes >> fail "BOOM")

这个版本的底部的行为取决于你导入了哪些库。

由于您询问“通用”类型,因此您可能指的是可以有用地包含任何值的事物的类型。在这种情况下,请查看Data.Dynamic,它允许您将任何具有内存表示的内容转换为“动态”类型的值。稍后,当使用“动态”类型的值时,您可以尝试将其转换为更具体的类型,您可以实际使用它来做一些有用的事情。

于 2012-09-02T07:21:07.267 回答