Scheme中异常的参数传递方式



我试图在scheme中实现一个函数,该函数将给定的列表与作为参数给定的函数进行拆分。举个例子:

(splitby '("a" "b" "cc" "ab" "abc" "a" "b")
         (lambda (x y) (= (string-length x) (string-length y))))

应返回(("a" "b") ("cc "ab") ("abc") ("a" "b"))

我是Scheme的初学者,所以很难理解这个"类函数"参数是如何工作的,在实现这样的函数时,我应该怎么做?

在Scheme中,函数是数字、字符串等对象。因此,在这种情况下,您的示例等效于:

(define (equal-length x y)
  (= (string-length x) (string-length y)))
(splitby '("a" "b" "cc" "ab" "abc" "a" "b") equal-length)

该功能的用途是允许自定义拆分标准。在这种情况下,只要给定函数返回真值,项目就在同一组中;否则将创建一个新组。

首先,编写一个group-equal函数,将相等的元素分组在一起:

(define (group-equal lst)
  ...)

其中,例如,

(group-equal '(1 2 2 3 3 3 4))

返回

((1) (2 2) (3 3 3) (4))

如果您成功地实现了这一点,那么它与splitby函数完全相同,只是您使用给定的函数(例如equal-length)而不是equal?group-equal可能使用)。

首先,在Scheme中,所有内容都在括号内。因此,如果您想将函数f应用于值xy,您可以编写:

(f x y)

所以你只需要把splitby放在第一组parens里面。

其次,函数可以作为值传递到其他函数中,就像传递数据一样
所以如果我有一个函数:

(define (double x)
    (* x 2))

我可以写另一个以double为自变量的函数:

(define (change_result f x)
   (f (+ 3 x)))
; (change_result double 6) returns 18

如果我使用lambda(匿名)函数,我也可以用同样的方法:

(change_result (lambda (x) (* 3 x)) 10)

相关内容

最新更新