Haskell全新。我正在玩斐波纳契序列来学习语言的基础知识,我找不到惯用的做法。
Fibonacci序列可以这样定义:
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
(那已经很酷)。然后,我想使用序列来近似黄金比率(Phi)。所以:
ratios = zipWith (/) (tail fibs) fibs
是更好和更好的近似Phi的列表。假设我希望在列表在给定阈值epsilon下“稳定”时获得第一个值。 (即:两个连续的比率值之间的差异小于epsilon)。我可以看到我如何用命令式语言(使用索引)来做到这一点,但是如何在Haskell中这样做呢?
(我们需要使用以下列表吗?但是如何?)
diffs = zipWith (-) ratios (tail ratios)
答案 0 :(得分:3)
如何?通过使用另一个zip
。这是一个基于你已经拥有的单行内容:
snd . head . dropWhile (\(p1,p0) -> abs (p0 - p1) >= epsilon) $ zip ratio (tail ratio)
从右到左阅读,这说:
zip
将比率列表与其继承人列在一起epsilon
,则列表中的答案 1 :(得分:3)
一种可能性是使用list comprehensions:
getApprox threshold = head $ [ratio | (ratio, diff) <- zip (tail ratios) diffs
, abs diff < threshold
]