首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使非谓词类型与类型类一起工作

如何使非谓词类型与类型类一起工作
EN

Stack Overflow用户
提问于 2016-07-21 19:56:10
回答 1查看 131关注 0票数 2

我在看我能用ImpredicativeTypes做什么,并想看看我到底能用它们做些什么。当我跑到我觉得是一些奇怪的行为,当涉及到他们与TypeClasses的互动。

代码语言:javascript
复制
:t mempty
mempty :: forall a. Monoid a => a

:t Right
Right :: forall a b. b -> Either a b

所以我想我可以把它们组合成一个非预测类型的表达式:

代码语言:javascript
复制
:t Right mempty
Right mempty :: forall a b. Monoid b => Either a b

看起来,扩展并不会推断非谓词类型,这似乎并不是不合理的,因为我知道,在一般情况下,当您开始添加这样的特性时,类型推断并不总是可能的。

因此,我决定,我只是想要一个非谓词类型的明确的事实:

代码语言:javascript
复制
:t Right mempty :: forall a. Either a (forall b. Monoid b => b)

在我看来,这是非常合理的,因为我实际上只是用b类型的mempty粘贴在Right类型的签名上,然后不提升forall

但它给了我以下错误:

代码语言:javascript
复制
No instance for (Monoid (forall b. Monoid b => b))

这听起来相当荒谬。因为根据定义,每个Monoid都是Monoid的一个实例。

有人能跟我解释一下到底是怎么回事吗?当实际使用该类型时,很难或不可能实际决定一个实例,因此GHC的真正意思是“没有明确/可判定的实例用于.”。而不是“没有.”?

顺便提一句,当你把打字机从这种情况中移开时,一切似乎都正常:

代码语言:javascript
复制
:t Right undefined :: forall a. Either a (forall b. b)

类型检查,并返回我指定的非谓词类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-28 16:06:14

因此,这个问题不会被标记为未回答,我想我只想重申一下评论中所说的话。

基本上,ImpredicativeTypes是完全不受支持的,而且没有人真正知道它应该如何工作。因此,在它目前的状态下尝试做任何有意义的事情都是个坏主意。因此,答案是:“不要试图那样做”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38513259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档