2015-05-12 65 views
0

以下函数应该返回具有多项式的列表中所有多项式的和作为浮点列表。 (即:4x²+ 2X + 1将[4,2,1]和5x⁵+ X + 2 [5,0,0,0,1,2]Haskell本地函数不在范围内

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的工作,所以我” d猜测我在使用binpsum (x1, x2)的方式中有错误,因为我在where子句中找不到任何错误。

谢谢!

+0

如果我猜的话,我会说这是可能的缺口问题。最后两行需要缩进至上面一行。 (即,“binpsum”需要在所有三条线上排队)。 – MathematicalOrchid

+0

尝试修复缩进,以使三条'binpsum'行开始在同一列上。 – chi

+0

对不起,粘贴代码就像这样做了缩进,我的代码有缩进,就像我刚刚编辑它并获取该错误。 – mjgalindo

回答

4

where子句只提供与上面(或左边)正方程式的绑定。你可以通过将其移动到psum的第一个实际使用位置来解决此问题。

除此之外,还有一些我看到在你的代码各种额外的误解:

  1. 当一个函数像f x y定义,它必须调用也喜欢(不喜欢f (x, y))。
  2. 如果您想对列表中的单个项目进行模式匹配,则必须将该项目括在方括号中以指示它确实是您要绑定的项目,而不是列表本身。
  3. 如果函数的参数是多个单词/符号的表达式,则通常需要将其括在括号内(例如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 
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 = 3xs = []

+0

我认为'binpsum(x1,x2)'应该改成'binpsum x1 x2',因为根据其定义'binpsum'的类型是'[Float] - > [Float] - > [Float]' –

+0

Yes ,我刚刚编辑。我只是重新安排了代码,并没有试图运行它是诚实的。干杯。 – thoferon

+0

你们俩都是对的。然而,现在我得到'输入'上的解析错误:''on'(x1:x2:xs)'''。不应该得到两个列表和其余的工作? – mjgalindo