此代码类型检查:
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
,它无法进行类型检查。 - 什么是
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
的部分应用的 ->
运算符s Type -> Type
签名提升了一个级别……时髦的东西。
关于haskell - haskell 中的 `foreach`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70948564/