函数应该返回列表的运行和。例如,使用返回[1,3,6,11]的[1,2,3,5]调用它。
我写的这个函数如下:
sumlist' :: [xx]=[xx]
sumlist' []=[]
sumlist' [x]=x
sumlist' xx=scanl1 (+) [xx]当我在GHcI中运行它时,它向我展示了我做了多个声明。那么这个函数有什么问题呢?
发布于 2011-01-20 02:11:40
首先,您希望将声明更改为类似于
sumlist' :: [xx]->[xx]因为sumlist‘接受xx类型的列表并返回xx类型的列表。
由于我们在调用scanl1时使用了(+),并且(+)需要Num类型,所以我们需要返回到sumlist的定义,并告诉它我们专门获取Num的列表。
sumlist' :: Num xx=>[xx]->[xx]scanl1可以处理空列表,所以您需要做的就是
sumlist' :: Num xx=>[xx]->[xx]
sumlist' xx = scanl1 (+) xx但是,如果您仍然想尝试一下您的代码,那么您需要修复最后两行:
对于x包含1元素的情况,您需要:
sumlist' [x] = x记住,‘接受一个列表,返回一个列表列表,所以只需返回列表即可!
sumlist' [x] = [x]对于最后一种情况,你需要一个名为xx的列表,你可以得到
sumlist' xx=scanl1 (+) [xx]xx已经是一个列表,所以GHC会认为[xx]是一个列表的列表,所以去掉括号就可以了
sumlist' xx=scanl1 (+) xx因此,我们修改后的代码类似于:
sumlist' :: Num xx=>[xx]->[xx]
sumlist' []=[]
sumlist' [x]=[x]
sumlist' xx=scanl1 (+) xx正如ephemient所说,如果您需要向GHCi输入多行代码,请使用:load命令。
希望这能帮到你,祝你黑客快乐:-)
发布于 2011-01-20 01:39:40
sumlist' :: [xx]=[xx]那条线是错的。::后面的部分应该是一个类型声明,看起来像[a] -> [a]。(是的,它看起来像模式/值[xx],但不是。)
不要试图在GHCi中输入多行声明,它会单独处理每一个输入行。只需将其保存到一个文件中,然后从GHCi中:load该文件即可。
发布于 2011-01-20 05:56:44
这不是对您问题的直接回答,但使用高阶函数定义sumList的更好方法是:
sumList :: (Num a) => [a] -> [a]
sumList = tail . scanl (+) 0还要注意,尽管很明显将=误认为->,但您的类型签名将是“过于多态的”,因为您的函数只适用于“Num类中的某个类型”的列表,而不是“任何类型的列表”。
https://stackoverflow.com/questions/4738609
复制相似问题