【问题标题】:Scheme Variable Arity on Higher-Order Function高阶函数上的方案变量 Arity
【发布时间】:2015-05-29 22:12:17
【问题描述】:

我是 Scheme 的新手,这是家庭作业,所以我要求的是提示而不是完整的解决方案。我正在编写一个名为 type-checked 的过程,它将过程和零个或多个类型谓词作为参数。该过程的值是一个可变参数过程:如果它的参数与给定类型检查的相应类型匹配,则它返回在参数上调用的过程的值。否则,它会报告错误。

我有这个程序适用于这样的事情:

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

我试图弄清楚在调用过程时如何接受可变数量的参数。非常感谢任何帮助,并提前感谢您!

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    types 需要像 args 一样是一个 rest 参数,因为这两个参数都是值的列表,您不需要将它们包装在列表中,并且您需要使用 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 令人沮丧,但却是一种很酷的语言。谢谢您的帮助!我已经接受了你的回答。 :)
    • @AbigailB 不客气。对我来说,地图和折叠完全令人兴奋。我推荐old wizard videos。它有点旧,但他们真的很擅长解释概念。在 7a 中,他们解释了 eval
    • 谢谢你的链接,我一定会去看看的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2013-04-23
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多