Haskell の sum と product を Scheme で実装

sum takes a list of numbers and returns their sum.

product takes a list of numbers and returns their product.


ghci> sum [5,2,1,6,3,2,5,7]
31
ghci> product [6,2,1,2]
24
ghci> product [1,2,5,6,7,9,2,0]
0


http://learnyouahaskell.com/starting-out#an-intro-to-lists

Schemeで書くと

(define (sum lnum)
  (cond
    ((null? lnum) 0)
    (else (+ (car lnum) (sum (cdr lnum))))
  )
)

(define (prod lnum)
  (cond
    ((null? lnum) 1)
    ((zero? (car lnum)) 0)
    (else (* (car lnum) (prod (cdr lnum))))
  )
)

でいいのかな? 以下実験。

> (sum '(5 2 1 6 3 2 5 7))
31
> (prod '(6 2 1 2))
24
> (prod '(1 2 5 6 7 9 2 0))
0

いいみたいだ。でも(prod '())とすると

> (prod '())
1

となってしまうのが気になる。ここは0かエラーを返すべきかとも思うが、GHCでも

Prelude> product[]
1

となるので、別にいいのか。