練習問題 : 高階関数


今回の練習問題は、1, 2, 3 は簡単ですが、 4 はかなり難しいです。 4 が手につかないという人は、 以前の課題を高階関数をつかって書き直してみると、 高階関数の有りがたみを知る事ができて良いでしょう。
1.
関数 func と整数 n を引数にとり、 f(0) + ... + f(n) を 計算する
     summation f n
を定義せよ

解答例

2.
あるデータ構造 X は、X もしくは整数を要素とするリストであるとする。 X に含まれる全整数を平坦に並べたリスト Y を作る flatten をつくれ。 但し、 X 内での順序は保たれるものとする。

解答例

3.
以下の関数 fold を定義せよ。
     fold f (x0 ... xn) b = (f x0 (f x1 (.... (f xn b)..))
     fold f () b = b
また、fold をもちいて length を定義せよ。 また、sum = 1 + ... + n, prod = 1 * ... * n fold を用いて定義せよ。

解答例

4. (Scheme のサブセットの 評価器 を作りましょう: 1)
次のような S 式 の集合 expression を考える。つまり、 *, +, <, =, > 演算と数字と if だけの簡単な Scheme 式の形をした S 式である。
expression      ::= number | #t | #f 
                  | (if expression expression expression)
		  | (procedure expressions)
expressions     ::= null-expression | expression expressions
null-expression ::= 
procedure       ::= primitive-procedure
primitive-procedure  ::= + | * | < | = | >
この評価器を作ることを考える。 とりあえず、以下の部分を作ったので、これを参考に評価器を完成させよ。
(define primitive-procedure-names '(* + - / < = >)) ; primitive-procedure の名前
(define (primitive-procedure? procedure)            ; primitive-procedure かの判断
  (and (symbol? procedure)
       (member procedure primitive-procedure-names)))

(define (primitive-procedure-to-scheme-primitive procedure)  
  (cond ((eq? procedure '+) +)                 ; 各 primitive-procedure (名前)に
	((eq? procedure '*) *)                 ; 対応する Scheme の関数
	((eq? procedure '-) -)
	((eq? procedure '/) /)
	((eq? procedure '<) <)
	((eq? procedure '=) =)
	((eq? procedure '>) >)))

;;;
;;; evaluator 本体
;;;

(define (eval-expr expr)
  (cond ((prim-expr? expr) expr)
	((if-expr? expr)
	 (eval-if (cond-expr expr) (then-expr expr) (else-expr expr)))
	((application? expr)
	 (apply-proc (operator expr)
		     (eval-arguments (operands expr))))
	(else (display expr)
	      (error "Unknow Expression :: eval-expr"))))

;;; apply 本体

(define (apply-proc procedure arguments)
  (cond ((primitive-procedure? procedure)
	 (apply-primitive-procedure procedure arguments))
	(else (display procedure)
	      (error "Unknow Procedure :: apply-proc"))))

解答例


99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp