Haskell 本地函数不在范围内

Haskell local function Is not in scope

下面的函数应该return列表中所有多项式的总和,其中一个多项式作为浮点数列表。 (即: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 子句中找不到任何错误。

谢谢!

你的函数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 = 3xs = [] 相匹配。

where 子句仅提供对等式正上方(或左侧)的绑定。 您可以通过将其向上移动,在psum 方程的第一个实际使用的地方。

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

  1. 当一个函数像 f x y 那样定义时,它也必须像那样被调用(不像 f (x, y))。
  2. 如果您要对列表中的单个项目进行模式匹配,则必须将该项目括在方括号中以表明它确实是您要绑定的项目,而不是列表本身。
  3. 如果函数的参数是多个 word/symbol 的表达式,您通常需要将其括在方括号中(例如 f (a + b) 而不是 f a + b)。

这是您的代码编译版本:

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