Name: Anonymous 2012-07-16 4:40
How is the idea of ``squaring'' expressed?
(defclass multipliable-list () ((xs :type 'list :initarg :xs)))
(defgeneric get-multipliable-list-product (x))
(defmethod get-multipliable-list-product ((x multipliable-list))
(reduce #'* (slot-value x 'xs)))
(defclass i-squarable () ((x :type number :initarg :x)))
(defclass squarable-number (i-squarable) ())
(defgeneric make-squarable-number-from-number (x))
(defmethod make-squarable-number-from-number ((x number))
(make-instance 'squarable-number :x x))
(defgeneric make-multipliable-list-from-squarable (x))
(defmethod make-multipliable-list-from-squarable ((x i-squarable))
(let ((num (slot-value x 'x)))
(make-instance 'multipliable-list :xs (list num num))))
(defun square (x)
(get-multipliable-list-product (make-multipliable-list-from-squarable (make-squarable-number-from-number x))))
def square(num): return num*num
(lambda (x) (* x x))
(INT x)INT: x ** 2
#(* % %)
(<$>)(=<<)(<$>(*))($)id((sum<$>inits[1,3..])!!)
(<$>)(=<<)(<$>(*))($)id
fmap (=<<) (fmap (*)) id id
((=<<) . ((*) .)) id id
((=<<) . (\g x -> (*) (g x))) id id
(\y -> (=<<) ((\g x -> (*) (g x)) y)) id id
(=<<) ((\g x -> (*) (g x)) id) id
(=<<) (\x -> (*) (id x)) id
(=<<) (\x -> (* x)) id
(=<<) (*) id
(*) =<< id
\z -> (* z) (id z)
\z -> z * z
;;; This is all we need:
(define zero (lambda (f) (lambda (x) x)))
(define add-1 (lambda (n) (lambda (f) (lambda (x) (f ((n f) x))))))
;;; We define ``two''
(define two (lambda (f) (lambda (x) (f (f x))))) ; or (define two (add-1 (add-1 zero)))
;;; ``square'' is simply:
(define square (lambda (n) (two n)))
;;; Some shit only useful for mortals:
(define (church->int n)
((n add1) 0))
(define int->church
(lambda (n)
(if (zero? n)
zero
(add-1 (int->church (- n 1))))))
;;; Now let's say you want 14^2
(define fourteen (int->church 14))
(church->int (square fourteen)) ;yields 196