Просто добавьте and
с условием, согласно которому длины обоих списков должны быть одинаковыми.
#lang racket
(define (weighted-sum . ws)
(define (sub . vs)
(and (= (length ws) (length vs)) ; <- ADDED
(foldl (lambda (i j res) (+ res (* i j))) 0 ws vs)))
sub)
; TESTS
(module+ test
(require rackunit)
(check-equal? ((weighted-sum)) 0)
(check-equal? ((weighted-sum 1 2 3 4) 10 20 30 40) 300)
(check-equal? ((weighted-sum 1 2 3 4) 10 20 30) #f)
(check-equal? ((weighted-sum 1 2) 10 20 30) #f))
Редактировать:
Здесь я связываю результат в let
, а затем просто проверяю, равен ли он 1. Если это так, and
приведет к result
, иначе это приведет к #f
.
(define (weighted-sum . ws)
(define (sub . vs)
(and (= (length ws) (length vs))
(let ([result (foldl (lambda (i j res) (+ res (* i j))) 0 ws vs)])
(and (= result 1) result))))
sub)
Примечание: (if <some-condition> <then-expr> #false)
эквивалентно (and <some-condition> <then-expr>)