Scheme中参数传递的不寻常方式

时间:2012-01-07 18:41:15

标签: 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中非常初学,所以很难理解这个'函数'参数是如何工作的,并且在实现这样的函数时我该怎么办?

2 个答案:

答案 0 :(得分:1)

在Scheme中,函数是数字,字符串等对象。所以在这种情况下,你的例子等同于:

(define (equal-length x y)
  (= (string-length x) (string-length y)))

(splitby '("a" "b" "cc" "ab" "abc" "a" "b") equal-length)

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

要开始使用,请编写一个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?(作为{{1}可能会使用)。

答案 1 :(得分:1)

首先,在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)