1

複数の引数を取り、次のようなフィボナッチ数の無限リストを生成する汎用ルーチンをコーディングしました。

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq) ;
fun fibo (a,b) = Cons(a, fn () => fibo(b,a+b));

val fib = fibo(0 , 1);

しかし、問題は、カリー化手法を使用して、0 と 1 から始まるフィボナッチ数のこの無限リストを生成したいということです。カリー化の概念について完全に困惑しています。

この例を使用して、カリー化の概念について教えてもらえますか? SMLNJ でカリー化を使用してフィボナッチ数の無限リストを生成するにはどうすればよいですか?

4

2 に答える 2

3

どうぞ:

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq) ;
fun fibo a b = Cons(a, fn () => fibo b (a + b));

val fib = fibo 0 1;

もう 1 つの (非常に便利な) カリー化された関数:

(* take n seq returns the first n items in seq. Raises Subscript if there
   are too few items. *)
fun take 0 _            = []
  | take _ Nil          = raise Subscript
  | take n (Cons (a,f)) = a :: take (n - 1) (f ())

例 (mosml インタープリターでは、SML/NJ とは若干異なる場合があります):

- take 10 fib;
> val it = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] : int list

そして、カリー化の力を少し見せびらかすだけです。

val firstTen = take 10

- firstTen fib;
> val it = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] : int list

ここで何が起こるかというと、take引数を 1 つだけ与えるということです。takeは typeint -> 'a seq -> 'a listを持っているので、int引数を与えることで何らかの型を取得します。つまり、入力として与えられ'a seq -> 'a listた 10 個のアイテムを返す関数です。'a seq

于 2013-11-01T08:46:21.023 に答える