干得好:
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;
还有另一个(非常有用的)咖喱函数:
(* 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
一个论点。take
有 type int -> 'a seq -> 'a list
,所以通过给它int
参数,我得到了一些类型的东西'a seq -> 'a list
- 即一个返回'a seq
你给它作为输入的 10 个项目的函数。