此代码类型检查:
type T :: Type -> foreach (r :: Type) -> Type -> Type
data T k r a
type T' :: Type -> Type
type T' a = T a Identity a
- 为什么编译器需要
Type -> Type
(即Identity
(类型?如果将Identity
替换为Int
,则无法键入check - 什么是
foreach
关键字,如何在Haskell中使用它
它不是关键字,只是一个隐式量化的类型变量。这就像你写一个函数
foo :: Int -> foreach r -> Double
foo = undefined
main = print ( foo 123 (Just 'w')
, foo 789 [False, True, False] )
因此foreach r
可以与Maybe Char
或[Bool]
统一,但不能与例如Float
统一。
现在,在您的示例中,这更奇怪,因为没有将Identity
应用于任何内容。这意味着T a Identity a
中的foreach
类型似乎实际上是Identity
的Type -> Type
签名提升了一个级别的部分应用的->
运算符。。。时髦的东西。