将存在者放入monad

时间:2010-11-05 14:27:20

标签: haskell monads polymorphism

我有以下问题。我有(forall r. MyType r)类型的值,我需要ParsecT s u m (forall r. MyType r)。是否可以在不提供额外data结构的情况下进行此操作?

1 个答案:

答案 0 :(得分:9)

一般来说,如果你有一个真正的存在类型,就不允许“逃避”到更广泛的范围。类型(forall r. MyType r)表示“对于您可以想到的任何MyType r,这是r”,非常类似Nothing类型forall a. Maybe a;这并不意味着存在一些未知的r,因此您有一个MyType

如果你真的想要一个多态的术语,那完全是另一回事,但我会假设你真的存在意义上的存在。

正如我在问题的评论中提到的,存在类型代表具有特定但未知类型的值。因为您不知道类型,所以您可以使用这样的值对其应用一个在其参数中具有多态性的函数。没有办法直接谈论存在主义类型,所以对你的问题的简要回答是:否。

为了操纵存在类型,您可以使用类似forall t. (forall r. MyType r -> t) -> t的类型将其隐藏在延续中,或者将其隐藏在data ExistMyType = forall r. ExistMyType (MyType r)等数据结构中。事实上,这些几乎是相同的,因为延续相当于数据类型的Church编码。

但老实说,我怀疑你真正应该做的是重新考虑你的方法。存在类型很笨拙,有点令人困惑,而且通常不是Haskell中的最佳解决方案。特别是我怀疑任何类似于你写的类型的东西实际上都是有用的。不过我可能错了。