我正在尝试在方案中实现一个函数,该函数将给定列表与函数分开,该函数也作为参数提供给函数。举例说明:
(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中非常初学,所以很难理解这个'函数'参数是如何工作的,并且在实现这样的函数时我该怎么办?
答案 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
应用于值x
和y
,请写下:
(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)