どうぞ:
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