【发布时间】:2016-07-17 20:59:45
【问题描述】:
我正在学习 Haskell,并尝试实现一个函数来获取包含前 N 个斐波那契数的列表:
fibonacci :: Integer -> [Integer]
fibonacci 1 = [0]
fibonacci 2 = fibonacci 1 ++ [1]
fibonacci n = appendSumOfLastTwo (fibonacci (n - 1))
appendSumOfLastTwo :: (Num a) => [a] -> [a]
appendSumOfLastTwo xs = xs ++ [addLastTwo xs]
addLastTwo :: (Num a) => [a] -> a
addLastTwo xs = last xs + (xs !! ((length xs) - 2))
这可行,但不是很漂亮,因为它需要两个具有奇怪名称的辅助函数。在 Haskell 中,有这种单独使用的函数很常见吗?
为了摆脱这些函数,我尝试了匿名函数:
fibonacci :: Integer -> [Integer]
fibonacci 1 = [0]
fibonacci 2 = fibonacci 1 ++ [1]
fibonacci n = (\xs -> xs ++ [(\xs -> last xs + (xs !! ((length xs) - 2))) xs]) (fibonacci ( n - 1))
但这并没有更好,因为它几乎完全不可读。
你们觉得呢?我怎样才能最好地构建我的代码?
【问题讨论】:
-
虽然我个人很喜欢这类问题(并且确实引发了一些很好的答案),但遗憾的是,这些问题并不适合 SO - 看你真的没有问题,你要求建议或代码审查,我认为 StackExchange 上的 codereview 网站可能确实对那些人来说是一个更好的地方
-
哦,好吧。谢谢,下次我会在那里发布此类问题。
标签: haskell anonymous-function fibonacci