Functional programming 如何在racket中编写排除函数?

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

函数excludes生成str中所有不是大写或小写字母或数字0-9的字符。如果字符串为空,则生成“”

代码

例如:

(不包括“”)=>“”

(不包括“@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))))