【发布时间】: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