你如何抽象函数在方案中起作用

时间:2014-11-22 22:13:50

标签: scheme racket

如何将查找字符串抽象为 generic-find-string ,以便它使用的字符串比较操作是一个参数。使用本地?或任何其他抽象函数?
我的 find-string 通过递归,

;; find-string: Lof[string] string -> Boolean 
;; true if and only if the given string was in the list

(define (find-string los s)
    (cond
       [(empty? los) false]
       [(cons? los) (cond
                    [(string=? s (first los)) true]
                    [else (find-string (rest los) s)])]))

(check-expect(find-string (list "a" "b" "c") "a") true)
(check-expect(find-string (list "a" "b") "f") false)
(check-expect(find-string empty "a") false)

我想我们可以使用本地(也许不是?它看起来像地图或过滤器)和generic-find-string的合约将是,

;; generic-find-string: (Lof[string] string -> Boolean ) Lof[string] -> Boolean 
;; true if and only if the given string was in the list

然后使用此抽象来定义 find-string-case-sensitive ,它应该以与原始查找字符串相同的方式运行,并且find-string-case-insensitive,它具有相同的收缩作为查找字符串,但在比较字符串时忽略字母字符的情况(即字符a被认为与A相同,依此类推;非字母字符仍必须完全匹配)。

有什么想法和建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

提取比较只是添加第三个参数作为你的n-ary比较函数的问题:

(define (find-gen op los s)
    (cond
       [(empty? los) false]
       [(cons? los) (cond
                    [(op s (first los)) true]
                    [else (find-gen op (rest los) s)])]))

(find-gen string=? (list "a" "b" "c") "a")
=> #t
(find-gen string=? (list "a" "b") "f")
=> #f
(find-gen string=? empty "a")
=> #f

然后根据find-string

重新定义find-gen
(define (find-string los s)
    (find-gen string=? los s))

从那时起,我相信您可以非常直接地定义您可能需要的所有变体。