(define-module (data monoid) #:use-module (oop goops) #:use-module (srfi srfi-1) #:export (null mappend <>)) (define-generic null) (define-generic mappend) (define (<> . args) (fold mappend (null (car args)) (reverse args))) ;;; Lists (define-method (mappend (a ) (b )) (append a b)) (define-method (mappend (a ) (b )) a) (define-method (mappend (a ) (b )) b) (define-method (mappend (a ) (b )) '()) (define-method (null (a )) '()) (define-method (null (a )) '()) ;;; Strings (define-method (mappend (a ) (b )) (string-append a b)) (define-method (null (a )) "")