【问题标题】:for/fold Throwing Arity Mismatch Exceptionfor/fold 抛出 Arity 不匹配异常
【发布时间】:2017-12-11 19:26:41
【问题描述】:

我正在阅读《美丽球拍》这本书。我正在尝试按照“遵循语法:bf”一章以功能方式创建自己的语言。

我已将我认为是我的问题的内容浓缩到以下程序中:

#lang racket

(define (fold-funcs control-list fruit-funcs)
  (for/fold ([current-list control-list])
            ([fruit-func (in-list fruit-funcs)])
    (apply fruit-func current-list)))

(define (driver)
  (define init-list (list))
  (display (fold-funcs init-list (list
                                  (lambda (lst) (cons "apple" lst))
                                  (lambda (lst) (cons "banana" lst))))))

当我在交互窗口(在 DrRacket 中)发出以下命令时:

(driver)

我希望得到以下结果:

'("banana" "apple")

事实上,我可以通过在“交互”窗口中发出以下命令来实现:

((lambda (lst) (cons "banana" lst)) ((lambda (lst) (cons "apple" lst))(list)))

但是,我实际上得到了以下错误:

...arity mismatch;
 the expected number of arguments does not match the given number
  expected: 1
  given: 0

我知道那是什么意思。这是说我试图执行一个需要单个参数而不提供该参数的过程。但我看不出这是怎么回事。 fold-funcs 被传递一个作为累加器的空列表和一个接受一个参数并返回一个列表的函数列表。 (从技术上讲,cons 返回一对,但我检查了,以下返回#t:

(list? (cons "apple" (list)))

我想知道为什么上述程序不起作用。

【问题讨论】:

  • apply 这里没有做你认为它正在做的事情。我相信你只想要(fruit-func current-list),而不是(apply fruit-func current-list)

标签: racket


【解决方案1】:

您的关闭,但滥用apply。大致上,apply 函数有两个参数:一个函数和一个列表。然后它将1函数应用于列表的参数,就好像它们一次直接传入一个一样。

例如,下面两段代码是等价的:

> (apply (lambda (x y) (+ x y)) '(1 2))
3

> ((lambda (x y) (+ x y) 1 2)
3

请注意,在一种情况下,我们如何传入“列表”'(1 2),而在另一种情况下,我们将12 作为单独的参数提供。

在您的 fold-funcs 函数中,您使用的是 apply:

(define (fold-funcs control-list fruit-funcs)
  (for/fold ([current-list control-list])
            ([fruit-func (in-list fruit-funcs)])
    (apply fruit-func current-list)))

它假定current-list 包含一一传递给fruit-func 的参数。但是,因为 fruit-func 需要一个参数,即列表本身,您将得到一个数量不匹配的问题。相反,如果您删除 apply 并直接调用 fruit-func,那么 driver 将按预期工作:

(define (fold-funcs control-list fruit-funcs)
  (for/fold ([current-list control-list])
            ([fruit-func (in-list fruit-funcs)])
    (apply fruit-func current-list)))

现在……

> (driver)
'(banana apple)

1糟糕的双关语,我知道...

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2012-01-24
    相关资源
    最近更新 更多