如何在函数定义中引用存在类型变量?

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 形式中的存在变量?

您误诊了问题。 kvlw 作为类型变量在范围内,但类型不兼容(k 不能与 [=13= 统一] 和 v 无法与 w 统一)。显示在函数体范围内工作的类型变量 lw 的另一个函数是这个例子:

(: 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))