【发布时间】:2015-01-04 13:32:18
【问题描述】:
在‘Practical type inference for arbitrary-rank types’,作者谈论包容:
我在阅读时尝试在 GHCi 中进行测试,但即使 g k2 旨在进行类型检查,但在我尝试使用 GHC 7.8.3 时却没有:
λ> :set -XRankNTypes
λ> let g :: ((forall b. [b] -> [b]) -> Int) -> Int; g = undefined
λ> let k1 :: (forall a. a -> a) -> Int; k1 = undefined
λ> let k2 :: ([Int] -> [Int]) -> Int; k2 = undefined
λ> :t g k1
<interactive>:1:3: Warning:
Couldn't match type ‘a’ with ‘[a]’
‘a’ is a rigid type variable bound by
the type forall a1. a1 -> a1 at <interactive>:1:3
Expected type: (forall b. [b] -> [b]) -> Int
Actual type: (forall a. a -> a) -> Int
In the first argument of ‘g’, namely ‘k1’
In the expression: g k1
g k1 :: Int
λ> :t g k2
<interactive>:1:3: Warning:
Couldn't match type ‘[Int] -> [Int]’ with ‘forall b. [b] -> [b]’
Expected type: (forall b. [b] -> [b]) -> Int
Actual type: ([Int] -> [Int]) -> Int
In the first argument of ‘g’, namely ‘k2’
In the expression: g k2
g k2 :: Int
我还没有真正理解这篇论文,但是,我仍然担心我误解了一些东西。这个类型检查应该吗?我的 Haskell 类型错了吗?
【问题讨论】: