如何将查找字符串抽象为 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相同,依此类推;非字母字符仍必须完全匹配)。
有什么想法和建议吗?提前谢谢。
答案 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))
从那时起,我相信您可以非常直接地定义您可能需要的所有变体。