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 = 3
和 xs = []
相匹配。
where
子句仅提供对等式正上方(或左侧)的绑定。 您可以通过将其向上移动,在psum
方程的第一个实际使用的地方。
除此之外,我在您的代码中发现了各种其他误解:
- 当一个函数像
f x y
那样定义时,它也必须像那样被调用(不像 f (x, y)
)。
- 如果您要对列表中的单个项目进行模式匹配,则必须将该项目括在方括号中以表明它确实是您要绑定的项目,而不是列表本身。
- 如果函数的参数是多个 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
下面的函数应该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 = 3
和 xs = []
相匹配。
where
子句仅提供对等式正上方(或左侧)的绑定。 您可以通过将其向上移动,在psum
方程的第一个实际使用的地方。
除此之外,我在您的代码中发现了各种其他误解:
- 当一个函数像
f x y
那样定义时,它也必须像那样被调用(不像f (x, y)
)。 - 如果您要对列表中的单个项目进行模式匹配,则必须将该项目括在方括号中以表明它确实是您要绑定的项目,而不是列表本身。
- 如果函数的参数是多个 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