以下函数应该返回列表中所有多项式的总和,该列表具有多项式作为浮点列表。 (即: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子句中找不到任何错误。
谢谢!
答案 0 :(得分:4)
where
子句仅提供与其正上方(或左侧)的等式的绑定。您可以通过在{的等式的第一个方向上向上移动来解决此问题。 {1}}实际使用它。
除此之外,我在您的代码中看到了各种其他误解:
psum
时,必须同样调用它(不像f x y
)。f (x, y)
而不是f (a + b)
)。以下是编译代码的版本:
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 = []
。