Примечание.. Этот вопрос больше связан с любопытством. Я хочу узнать из любопытства, возможно ли даже транслитерировать реализацию Haskell в функциональный эквивалент С#.
Итак, я был учить себя Haskell за отличную игру и при решении Project Euler проблемы, с которыми я столкнулся в этой прекрасной программе Haskell Fibonacci:
fibs :: [Integer]
fibs = 1:1:zipWith (+) fibs (tail fibs)
Конечно, у меня возникло соблазн написать такую версию С#, чтобы:
-
Если я это сделаю:
IEnumerable<int> fibs = Enumerable.Zip(Enumerable.Concat(new int[] { 1, 1 }, fibs), //^^error fibs.Skip(1), (f, s) => f + s);
Ошибка говорит о использовании неназначенной локальной переменной
fibs
. -
Поэтому я пошел немного повелительно, в то время как это компилируется...
public static IEnumerable<int> Get() { return Enumerable.Zip(Enumerable.Concat(new int[] { 1, 1 }, Get()), Get().Skip(1), (f, s) => f + s); }
Он ломается с исключением! Поэтому я пришел сюда.
Вопросы:
- Кто-нибудь может подумать о функциональном эквиваленте С#, который работает?
- Мне хотелось бы узнать, почему мои решения не работают.