2015-11-09 113 views
1
within :: (Ord a, Num a) => a -> [a] -> a 

,需要一个宽容,那就是,一些 ε和数的无限列表, 低头列表,在列表中找到两个连续的数字,不超过小量返回的第二个不同这些。 (如果没有这种对连续 元素它可能不会再回来。)例如,如何在Haskell中实现函数?

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 
+2

那么...你的问题是什么? – Zeta

+0

我其实并不知道如何一次拿2个元素,并检查它们是否相差不超过epsilon。如果我写了类似于检查xye = abs(xy)<= e的东西,我真的不知道如何在函数 – Alice

+2

内使用它。我不在我的电脑上,但是我已经写了一个关于采用两个元素的答案今天早些时候的一份清单这可能会有所帮助。基本上在eps(x:y:xs)= ...内使用''。但是,如果列表不是无限且/或不包含配对,则应该考虑函数的行为。 – Zeta

回答

5

在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匹配,检查xy是否足以给一个答案,并做所以它可以时,或重新启动自己(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) 

我会让你知道canGiveAnswerbuildAnswer应该是什么。

+0

谢谢!这非常有帮助! :d – Alice