Haskell本地函数不在范围内

时间:2015-05-12 09:10:03

标签: function haskell where local

以下函数应该返回列表中所有多项式的总和,该列表具有多项式作为浮点列表。 (即:4x²+ 2x + 1为[4,2,1]和5x⁵+ x + 2 [5,0,0,0,1,2]

psum :: [[Float]] -> [Float]
psum (x1:x2:xs) = psum (binpsum (x1, x2)):xs
psum x = x
    where   binpsum (x:xs) (y:ys) = x+y:binpsum (xs, ys) 
            binpsum (x) (y:ys) = x+y:ys
            binpsum (x:xs) (y) = x+y:xs

我正在

 Not in scope: ‘binpsum’

这是我第一次使用haskell,所以我猜我使用binpsum (x1, x2)的方式有问题,因为我在where子句中找不到任何错误。

谢谢!

2 个答案:

答案 0 :(得分:4)

where子句仅提供与其正上方(或左侧)的等式的绑定。您可以通过在{的等式的第一个方向上向上移动来解决此问题。 {1}}实际使用它。

除此之外,我在您的代码中看到了各种其他误解:

  1. 当函数定义为psum时,必须同样调用它(不像f x y)。
  2. 如果要对列表中的单个项目进行模式匹配,则必须将项目括在方括号中,以表明它确实是要绑定的项目,而不是列表本身。
  3. 如果函数的参数是多个单词/符号的表达式,则通常需要将其括在括号中(例如f (x, y)而不是f (a + b))。
  4. 以下是编译代码的版本:

    f a + b

答案 1 :(得分:3)

您的函数binpsum仅在第二个定义的范围内。您可以通过以下方式之一重写它:

psum :: [[Float]] -> [Float]
psum (x1:x2:xs) = psum (binpsum x1 x2):xs
  where 
    binpsum (x:xs) (y:ys) = x+y : binpsum xs ys
    binpsum (x) (y:ys) = x+y:ys
    binpsum (x:xs) (y) = x+y:xs
psum x = x

或更好:

psum :: [[Float]] -> [Float]
psum lst = case lst of
   x1:x2:xs -> psum (binpsum x1 x2) : xs
   _        -> lst
 where 
   binpsum (x:xs) (y:ys) = x+y : binpsum xs ys
   binpsum (x) (y:ys) = x+y : ys
   binpsum (x:xs) (y) = x+y : xs

编辑:在您的代码中进行了一些更正之后,它看起来像这样:(我只是编译它,我不知道它是否符合您的意图)

psum :: [[Float]] -> [Float]
psum lst = case lst of
    x1:x2:xs -> psum $ binpsum x1 x2 : xs
    [x]      -> x
  where
    binpsum [x] (y:ys)    = x + y : ys
    binpsum (x:xs) [y]    = x + y : xs
    binpsum (x:xs) (y:ys) = x + y : binpsum xs ys

请注意,binpsum (x:xs) (y:ys)现在已结束,因为[3](x:xs)x = 3匹配xs = []