当基本案例出错时使用foldr

时间:2016-05-26 00:36:35

标签: racket lazy-evaluation

我想知道如何将此功能转换为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))]))

1 个答案:

答案 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中的forceracket/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语言会为您提供这些delayforce,这就是

的原因

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

之前工作过。它随处可见delayforce。并且,每个delay形式就像添加额外的lambda(加上其他东西),每个force调用就像添加一个额外的零参数函数调用(加上其他东西)。 / p>