Mac*_*tka 1 polymorphism monads haskell
我有以下问题.我有类型的价值,(forall r. MyType r)我需要ParsecT s u m (forall r. MyType r).是否可以在不提供额外data结构的情况下完成?
一般来说,如果你有一个真正的存在类型,就不允许"逃避"到更广泛的范围.这种类型(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中的最佳解决方案.特别是我怀疑任何类似于你写的类型的东西实际上都是有用的.不过我可能错了.