Typed / Racket - 如何使此功能工作,不断收到TypeChecker错误

时间:2016-06-27 07:22:12

标签: racket

具有

(: f (-> Procedure (Pairof Integer Integer) Boolean))
   (define (f comparator pair)
      (comparator (first pair) (second pair)))

在TypedRacket中,我该如何使这个功能起作用?该函数应该像这样工作:

(f = '(1 2)) >>>> false.
(f > '(4 2)) >>>> true.

我收到以下错误:

Type Checker: Polymorphic function first could not be applied to arguments
Type Checker: Polymorphic function second could not be applied to arguments
Type Checker: cannot apply a function with unknown arity

所以可能是导致此错误的函数定义,但我该如何解决?

1 个答案:

答案 0 :(得分:2)

这是一个适用于您的示例的定义:

(: f (-> (-> Integer Integer Boolean) (Listof Integer) Boolean))
(define (f comparator pair)
  (comparator (first pair) (second pair)))

(f = '(1 2))   ; => #f

(f > '(4 2))   ; => #t

您必须将第一个参数的类型定义为函数,从两个整数到布尔值,第二个参数作为列表定义(因为您在函数调用中使用了一个列表)。

这是一个简单的定义,只是为了开始使用类型。您可以更改它以将函数应用于具有更常规类型的值,例如Number而不是Integer,多态函数等。