我想知道如何将此功能转换为foldr。特别是基本情况,这是一个错误。参数是列表和列表的元素。该函数只计算参数(x)中元素的元素数。
; [List-of X] X -> number or error
; Count number of elements to X
(define (cnt l x)
(cond
[(empty? l) (error x "not found")]
[(symbol=? (first l) x) 0]
[else (add1 (cnt (rest l) x))]))
答案 0 :(得分:1)
在普通严格的球拍中,这显然不可能,但是如果你将#lang lazy
放在DrRacket文件的顶部,则可以这样做:
#lang lazy
; [List-of X] X -> number or error
; Count number of elements to X
(define (cnt l x)
(foldr (lambda (y cnt-rest)
(cond [(symbol=? y x) 0]
[else (add1 cnt-rest)]))
(error x "not found")
l))
使用它:
> (cnt (list) 'a)
a: not found
> (cnt (list 'a) 'a)
0
> (cnt (list 'a 'b 'c) 'a)
0
> (cnt (list 'a 'b 'c) 'b)
1
> (cnt (list 'a 'b 'c) 'c)
2
> (cnt (list 'a 'b 'c) 'd)
d: not found
> (cnt (list 'a 'b 'c 'b 'a 'b 'c) 'c)
2
通过在lambda
表达式和零参数函数应用程序中以恰当的组合方式包装内容,也可以在普通球拍中执行此操作:
#lang racket
; [List-of X] X -> number or error
; Count number of elements to X
(define (cnt l x)
((foldr (lambda (y cnt-rest)
(lambda ()
(cond [(symbol=? y x) 0]
[else (add1 (cnt-rest))])))
(lambda ()
(error x "not found"))
l)))
虽然这可能非常棘手且难以理解。您也可以使用delay
中的force
和racket/promise
以另一种方式表达这一点:
#lang racket
; [List-of X] X -> number or error
; Count number of elements to X
(define (cnt l x)
(force (foldr (lambda (y cnt-rest)
(delay
(cond [(symbol=? y x) 0]
[else (add1 (force cnt-rest))])))
(delay
(error x "not found"))
l)))
delay
表格去了额外的lambda
s,而force
调用去了额外的零参数函数调用的地方。 #lang lazy
语言会为您提供这些delay
和force
,这就是
#lang lazy
; [List-of X] X -> number or error
; Count number of elements to X
(define (cnt l x)
(foldr (lambda (y cnt-rest)
(cond [(symbol=? y x) 0]
[else (add1 cnt-rest)]))
(error x "not found")
l))
之前工作过。它随处可见delay
和force
。并且,每个delay
形式就像添加额外的lambda
(加上其他东西),每个force
调用就像添加一个额外的零参数函数调用(加上其他东西)。 / p>