具有
(: 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
所以可能是导致此错误的函数定义,但我该如何解决?
答案 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,多态函数等。