作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我声明这个新类型时:
newtype ListScott a =
ListScott {
unconsScott :: (a -> ListScott a -> r) -> r -> r
}
ListScott :: ((a -> ListScott a -> r) -> r -> r) -> ListScott a
,编译器提示
r
不在范围内。从类型签名中我想将一流的多态函数传递给
ListScott
不是很明显吗? ?
r
需要显式类型限定符对于这样的情况?
最佳答案
这是编程语言设计的问题。可以按照您建议的方式推断,但我认为这是一个坏主意。
Isn't it apparent from the type signature that I want to pass a first class polymorphic function to ListScott?
GADTs
写的东西扩大:
data ListScott a where
ListScott :: { unconsScott :: (a -> ListScott a -> r) -> r -> r } -> ListScott a
r
在
unconsScott
中存在量化字段,因此构造函数具有以下第一种类型:
ListScott :: forall a r. ((a -> ListScott a -> r) -> r -> r) -> ListScott a
-- as opposed to
ListScott :: forall a. (forall r. (a -> ListScott a -> r) -> r -> r) -> ListScott a
r
而是作为
ListScott
的参数,但我们只是忘了添加它?我认为这是一个合理可能的错误,因为假设
ListScott r a
和
ListScott a
可以在某些方面作为列表的表示。然后,绑定(bind)器的推断将导致错误的类型定义被接受,并且一旦类型被使用,错误就会在其他地方报告(希望不会太远,但这仍然比定义本身的错误更糟糕)。
newtype T = T { unT :: maybe int }
-- unlikely to intentionally mean "forall maybe int. maybe int"
data R a = R
{ f :: (r -> r) -> r -> r
, g :: r -> r
}
data R r a = R
{ f :: (r -> r) -> r -> r
, g :: r -> r
}
=
的左侧确定是否
r
绑定(bind)在那里,如果不是,我们必须在每个字段中插入活页夹。我发现这使得第一个版本难以阅读,因为
r
这两个字段中的变量实际上不会在同一个活页夹下,但一目了然。
class Functor f where
fmap :: (a -> b) -> f a -> f b
class Functor f where
fmap :: forall a b. (a -> b) -> f a -> f b
id :: a -> a
id :: forall a. a -> a
, 因为没有其他级别
a
可以绑定(bind)。
关于haskell - 为什么 rank-n 类型需要显式的 forall 量词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225570/
我是一名优秀的程序员,十分优秀!