Functional programming 如何在racket中编写排除函数?
函数excludes生成str中所有不是大写或小写字母或数字0-9的字符。如果字符串为空,则生成“” 代码 例如:Functional programming 如何在racket中编写排除函数?,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,函数excludes生成str中所有不是大写或小写字母或数字0-9的字符。如果字符串为空,则生成“” 代码 例如: (不包括“”)=>“” (不包括“@hello friend”!”=>“@#!” 按顺序 如果不使用抽象函数(如filter等),我将如何做到这一点 ; String [Char -> Boolean] -> String ; filters string's characters by fun (define (filter-string-by str fun
(不包括“”)=>“”
(不包括“@hello friend”!”=>“@#!”
按顺序
如果不使用抽象函数(如filter等),我将如何做到这一点
; String [Char -> Boolean] -> String
; filters string's characters by fun
(define (filter-string-by str fun)
(list->string (filter fun (string->list str))))
; Char -> Boolean
; is char alphanumeric?
(define (alphanum? char)
(or (char-alphabetic? char)
(char-numeric? char)))
; String -> String
; only include alphanum chars in the str
(define (only-include-alphanum str)
(filter-string-by str alphanum?))
自定义过滤器
; [X] [X -> Boolean] [List-of X] -> [List-of X]
; keeps each element, e, of l where (f e) holds
(define (my-filter f l)
(cond
[(empty? l) '()]
[else (if (f (first l))
(cons (first l) (my-filter f (rest l)))
(my-filter f (rest l)))]))
这里的“诀窍”是将字符串转换为列表并返回,这样您就可以方便地使用列表函数和递归
在不使用任何高阶函数(如过滤器
)的情况下,列表上的基本过滤递归看起来有点像这样:
(define (a-filter ls)
(cond [(null? ls) '()]
[(include? (car ls)) (cons (car ls) (a-filter (cdr ls)))]
[else (a-filter (cdr ls))]))
其中过程包含?
完全是虚构的
在您的情况下,您可以这样写:
(define (no-alphanums ls)
(cond ((null? ls) '())
((not (alphanum? (car ls))) (cons (car ls) (no-alphanums (cdr ls))))
(else (no-alphanums (cdr ls)))))
然后你可以定义
(define (excludes s)
(list->string (no-alphanums (string->list s))))
你好,如果没有过滤器,我该怎么做。我注意到您在第一个函数中使用了filter。
(define (excludes s)
(list->string (no-alphanums (string->list s))))