如何在函数定义中引用存在类型变量?
How to Reference Existential Type Variables Inside Function Definition?
Haskell 的 ScopedTypeVariables
的球拍模拟是什么?例如。在
(: f (All (k v l w)
(-> (Listof k)
(HashTable k v)
(-> k v (Values l w))
(HashTable l w))))
(define (f keys m g)
(foldl (λ ([k : k] [m : (HashTable k v)]) ;; uh-oh!
(let-values ([(l w) (g k (hash-ref m k))])
(hash-set m l w)))
#hash()
keys))
k
& v
超出范围!如何在 lambda 范围内获取绑定在 All
形式中的存在变量?
您误诊了问题。 k
、v
、l
和 w
作为类型变量在范围内,但类型不兼容(k
不能与 [=13= 统一] 和 v
无法与 w
统一)。显示在函数体范围内工作的类型变量 l
和 w
的另一个函数是这个例子:
(: f (All (k v l w)
(-> (Listof k)
(HashTable k v)
(-> k v (Values l w))
(HashTable l w))))
(define (f keys m g)
(foldl (λ ([k : k] [acc : (HashTable l w)]) ; can refer to l and w
(let-values ([(l w) (g k (hash-ref m k))])
(hash-set acc l w)))
(ann #hash() (HashTable l w)) ; can refer to l and w
keys))
Haskell 的 ScopedTypeVariables
的球拍模拟是什么?例如。在
(: f (All (k v l w)
(-> (Listof k)
(HashTable k v)
(-> k v (Values l w))
(HashTable l w))))
(define (f keys m g)
(foldl (λ ([k : k] [m : (HashTable k v)]) ;; uh-oh!
(let-values ([(l w) (g k (hash-ref m k))])
(hash-set m l w)))
#hash()
keys))
k
& v
超出范围!如何在 lambda 范围内获取绑定在 All
形式中的存在变量?
您误诊了问题。 k
、v
、l
和 w
作为类型变量在范围内,但类型不兼容(k
不能与 [=13= 统一] 和 v
无法与 w
统一)。显示在函数体范围内工作的类型变量 l
和 w
的另一个函数是这个例子:
(: f (All (k v l w)
(-> (Listof k)
(HashTable k v)
(-> k v (Values l w))
(HashTable l w))))
(define (f keys m g)
(foldl (λ ([k : k] [acc : (HashTable l w)]) ; can refer to l and w
(let-values ([(l w) (g k (hash-ref m k))])
(hash-set acc l w)))
(ann #hash() (HashTable l w)) ; can refer to l and w
keys))