如何设计一个带有两个布尔参数的函数,如果其中一个(或两个)参数为真,则 returns 为真?

How to design a function that takes two Boolean parameters and returns true if either (or both) of the parameters are true?

;布尔 b1 b2:

;#true & #true => #true

;#true & #false => #true

;#false & #false => #false

我知道它是如何工作的,但我不知道如何在 Racket 中编写它。我应该在一个函数中有两个参数,但是我怎么能在 Racket 中写呢?它应该像

这样开始吗

(定义(要么是真的?b1 b2)

())

(定义(either-true?b1 b2) (如果 b1 #t b2))

还要确保您拥有这两个 check-expects: (check-expect (either-true?#t #f) #t) (check-expect (either-true?#f #t) #t)

祝大家好运 1 哈哈

您的 either-true? 已经存在于 Racket 中,名为 or

(define (either-true? b1 b2) (or b1 b2))

或者直接做:

(define either-true? or)

显示 either-true? 的正文可能只是
(or b1 b2)(if b1 #t b2) (甚至 (if b2 #t b1)

either-true? 的“目的”的字面实现可以是:

(define (either-true? b1 b2) ;; Boolean Boolean -> Boolean
  ;; produce #t if either b1 or b2 is true, otherwise #f
  (cond
    [ b1 #t ]
    [ b2 #t ]
    [else #f ]))

在 Racket 学生语言中,条件形式(ifcondor 等)要求他们 “question-expressions”为布尔值(#t#f)。其他球拍语言使用 Scheme interpretation of any non-#f value as true 在条件上下文中。

因此,使用对“真实性”的这种解释的另一个定义可能是:

#lang racket

(define (either-true? b1 b2) ;; Any Any -> Any
  ;; produce #f if both b1 and b2 #f, otherwise a truthy value
  (findf values (list b1 b2)))

值得注意的是,虽然 (either-true? b1 b2) 看起来像 (or b1 b2),但 是一个显着差异:如果 b1 为真,or 将不会评估 b2; either-true?一直 计算两个参数。可以看出区别运行:

#lang racket

(require math/number-theory)

(define (either-true? b1 b2)
  (or b1 b2))

(time (or           (prime? 7) (prime? (next-prime (expt 2 1000)))))
(time (either-true? (prime? 7) (prime? (next-prime (expt 2 1000)))))