Генерация бесконечного списка последовательности Фибоначчи в ML

Я должен создать бесконечный список, содержащий последовательность Фибоначчи. Я новичок в ML, поэтому я хочу проверить, правильно ли это.

-datatype 'a infist=NIL
=           | CONS of 'a * (unit -> 'a inflist);
- fun fib a b = CONS (a , fn()=> fib b (a+b));
val fib=fn: int->int-int inflist

Это то, что называется функцией генератора? Даст ли он мне реальный результат, то есть бесконечную последовательность Фибоначчи, когда я дам входы a и b?

1 ответ

Ваше определение типа данных и определение вашей функции кажутся правильными. Хотя я все же предпочел бы функцию Фибоначчи, которая не ожидает никаких аргументов, чтобы избежать возможности ошибочного ввода:

fun fibonacci () = 
   let
      fun fib(a,b) = Cons(a+b, fn() => fib(b,a+b))
   in
      Cons(0, fn()=> fib(0,1))
   end  

Это то, что я бы назвал потоком

Когда вы вызываете его, он дает элемент типа infislist. Вы можете написать некоторые другие функции для обработки вашего потока и интерпретации его содержимого. Вы можете увидеть некоторые примеры этого в моем другом ответе, например, такие функции, как takeWhile, take, filter, zip а также toList,

Другие вопросы по тегам