Haskell 中的`foreach`
`foreach` in Haskell
此代码类型检查:
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
签名中部分应用的 ->
运算符提升了一个级别......时髦的东西.
此代码类型检查:
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
签名中部分应用的 ->
运算符提升了一个级别......时髦的东西.