within :: (Ord a, Num a) => a -> [a] -> a
采用公差,即数字 epsilon和无限的数字列表,和 向下看列表,在列表中找到两个相差不超过epsilon的数字,它返回第二个数字。 (如果没有这样的一对,它可能永远不会返回 连续元素。)例如,
within 1.0 [1.0 ..] = 2.0
within 0.5 ([1.0, 32.5, 17.2346, 10.474, 8.29219, 8.00515]
++ [8.0, 8.0 ..])
= 8.00515
答案 0 :(得分:5)
在Haskell中,列表只是另一种数据结构,可能有一些(在我看来)令人困惑的符号。使用任何数据结构,您都可以使用模式匹配。当您只使用列表时,模式中有三种可能的东西:
x
。(:) x xs
一样(或者更为家喻户晓:x:xs
),[]
请注意,在模式中,您将构造函数应用于模式。编写(:) x ((:) y ys)
(通常写为x:y:ys
)是完全允许的,它匹配至少两个元素的任何列表,并将第一个元素分配给x
,第二个元素分配给{{1} },以及列表的其余部分y
。
ys
函数的骨架看起来像这样:
within
在这里,theFunction theList = case theList of
x:y:ys -> if canGiveAnswer x y
then buildAnswer x y
else theFunction (y:ys)
尝试将其输入与模式theFunction
进行匹配,检查x:y:ys
和x
是否足以给出答案,并在可以的时候这样做,或者重新启动自身(y
),删除列表的第一个元素。
你可以像
那样简洁地写出来theFunction (y:ys)
甚至
theFunction (x:y:ys) = if canGiveAnswer x y then buildAnswer x y else theFunction (y:ys)
当然,在你的情况下,你需要一个额外的论点:
theFunction (x:y:ys) | canGiveAnswer x y = buildAnswer x y
| True = theFunction (y:ys)
我会让你知道within :: (Ord a, Num a) => a -> [a] -> a
within epsilon (x:y:ys) | canGiveAnswer x y epsilon = buildAnswer x y epsilon
| True = within epsilon (y:ys)
和canGiveAnswer
应该是什么。