在Haskell中,列表是另一种数据结构,也许一些(在我看来)混淆的符号。使用任何数据结构,您都可以使用模式匹配。当您只使用列表时,您有三种可能的操作:
- 一个变量,如
x
。
- 适用于零个或多个模式的构造函数,
- 像
(:) x xs
(或者更familiarily:x:xs
),
- 或
[]
需要注意的是,在模式中,你应用构造函数模式。编写(:) x ((:) y ys)
(通常写为x:y:ys
)是完全可以的,它与至少两个元素的任何列表相匹配,并将第一个元素指定为x
,将第二个元素指定为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
和buildAnswer
应该是什么。
那么...你的问题是什么? – Zeta
我其实并不知道如何一次拿2个元素,并检查它们是否相差不超过epsilon。如果我写了类似于检查xye = abs(xy)<= e的东西,我真的不知道如何在函数 – Alice
内使用它。我不在我的电脑上,但是我已经写了一个关于采用两个元素的答案今天早些时候的一份清单这可能会有所帮助。基本上在eps(x:y:xs)= ...内使用''。但是,如果列表不是无限且/或不包含配对,则应该考虑函数的行为。 – Zeta