Генерация бесконечного списка последовательности Фибоначчи в 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
,