高阶函数上的方案变量元数
Scheme Variable Arity on Higher-Order Function
我是 Scheme 的新手,这是家庭作业,所以我要求的是提示而不是完整的解决方案。我正在编写一个名为类型检查的过程,它将一个过程和零个或多个类型谓词作为参数。该过程的值是一个可变元数过程:如果它的参数与给定类型检查的相应类型相匹配,那么它 returns 在参数上调用的过程的值。否则,它报告错误。
我有这个程序来处理这样的事情:
((type-checked sqrt number?) 100)
但不是为了这个:
((type-checked + number?) 1 2 3 4 5)
也就是说,我可以 运行 使用一个参数正确地执行过程,但不能使用可变数量的参数。这是相关代码:
(define (type-checked procedure types)
(lambda args
(if (types-match? (list types) (list args))
(procedure args)
(error "type mismatch"))))
如果我用括号将 args 括起来,我可以 运行 它在一个参数上。否则,我总是会收到类型不匹配错误。
这是类型检查调用的递归过程。它检查给定的类型是否与参数匹配。我知道它没有优化,但现在我的目标是工作代码。类型匹配?接受两个列表,类型谓词和值,并检查它们是否都匹配。我试图以一种有意义的方式对其进行评论。下面的代码似乎可以独立运行。
(define types-match?
(lambda (types values)
(if (= 1 (length types)) ;if there is only one type left
(if (null? values) ;if values is empty, finished
#t
(if ((car types) (car values)) ;else, check types with the rest of the list
(types-match? types (cdr values))
#f))
(if (null? values)
#t
(if ((car types) (car values)) ;if there is more than one type in types, call
(types-match? (cdr types) (cdr values)) ;compare with the first type in the list, then call on the rest of both types and values
#f)))))
我想弄清楚如何在调用过程时接受可变数量的参数。非常感谢任何帮助,并提前致谢!
types
需要像 args 一样是一个剩余参数,因为两个参数总是值列表,你不需要将它们包装在列表中,你需要使用 apply
来使用作为过程的多个参数的列表:
(define (type-checked procedure . types) ; types is a rest argument
(lambda args ; args is a rest argument
(if (types-match? types args) ; both are lists
(apply procedure args) ; (apply + '(1 2)) == (+ 1 2)
(error "type mismatch"))))
我发现,当您对多类型参数列表进行最后一次迭代时,它会假定所有最后的参数都是您提供的最后一种类型。例如。以下将实际工作:
((types-match? map procedure? list?) + '(1 2 3) '(1 2 3)) ; ==> (2 4 6)
我是 Scheme 的新手,这是家庭作业,所以我要求的是提示而不是完整的解决方案。我正在编写一个名为类型检查的过程,它将一个过程和零个或多个类型谓词作为参数。该过程的值是一个可变元数过程:如果它的参数与给定类型检查的相应类型相匹配,那么它 returns 在参数上调用的过程的值。否则,它报告错误。
我有这个程序来处理这样的事情:
((type-checked sqrt number?) 100)
但不是为了这个:
((type-checked + number?) 1 2 3 4 5)
也就是说,我可以 运行 使用一个参数正确地执行过程,但不能使用可变数量的参数。这是相关代码:
(define (type-checked procedure types)
(lambda args
(if (types-match? (list types) (list args))
(procedure args)
(error "type mismatch"))))
如果我用括号将 args 括起来,我可以 运行 它在一个参数上。否则,我总是会收到类型不匹配错误。
这是类型检查调用的递归过程。它检查给定的类型是否与参数匹配。我知道它没有优化,但现在我的目标是工作代码。类型匹配?接受两个列表,类型谓词和值,并检查它们是否都匹配。我试图以一种有意义的方式对其进行评论。下面的代码似乎可以独立运行。
(define types-match?
(lambda (types values)
(if (= 1 (length types)) ;if there is only one type left
(if (null? values) ;if values is empty, finished
#t
(if ((car types) (car values)) ;else, check types with the rest of the list
(types-match? types (cdr values))
#f))
(if (null? values)
#t
(if ((car types) (car values)) ;if there is more than one type in types, call
(types-match? (cdr types) (cdr values)) ;compare with the first type in the list, then call on the rest of both types and values
#f)))))
我想弄清楚如何在调用过程时接受可变数量的参数。非常感谢任何帮助,并提前致谢!
types
需要像 args 一样是一个剩余参数,因为两个参数总是值列表,你不需要将它们包装在列表中,你需要使用 apply
来使用作为过程的多个参数的列表:
(define (type-checked procedure . types) ; types is a rest argument
(lambda args ; args is a rest argument
(if (types-match? types args) ; both are lists
(apply procedure args) ; (apply + '(1 2)) == (+ 1 2)
(error "type mismatch"))))
我发现,当您对多类型参数列表进行最后一次迭代时,它会假定所有最后的参数都是您提供的最后一种类型。例如。以下将实际工作:
((types-match? map procedure? list?) + '(1 2 3) '(1 2 3)) ; ==> (2 4 6)