繁体   English   中英

关于Haskell中的scanl1

[英]About scanl1 in Haskell

函数应返回列表的运行总和。 例如用[1,2,3,5]调用将返回[1,3,6,11]

我写了这个函数,如下所示:

sumlist' :: [xx]=[xx]
sumlist' []=[]
sumlist' [x]=x
sumlist' xx=scanl1 (+) [xx]

当我在GHcI中运行它时,它表明我做了多个声明。 那么此功能有什么问题呢?

首先,您想将声明更改为

sumlist' :: [xx]->[xx]

因为sumlist'接受类型为xx的列表,然后返回类型为xx的列表。

由于我们在对scanl1的调用中使用(+),并且(+)需要Num类型,因此,我们将需要追溯到sumlist的定义,并告诉我们我们具体采用了Nums列表。

sumlist' :: Num xx=>[xx]->[xx]

scanl1可以处理空列表,因此您所需要做的就是

sumlist' :: Num xx=>[xx]->[xx]
sumlist' xx = scanl1 (+) xx


但是,如果您仍然想尝试一下代码,那么仍然需要修复最后两行:

对于x包含1个元素的情况,您具有:

sumlist' [x] = x

请记住,sumlist'会获取一个列表并返回一个列表 ,因此只需将列表返回即可!

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

临时代表所说,如果您需要向GHCi输入多行,请使用:load命令。

希望这会有所帮助,并祝您黑客愉快:-)

sumlist' :: [xx]=[xx]

那条线是错误的。 ::之后的部分应该是类型声明,看起来像[a] -> [a] (是的,看起来模式/值[xx] ,但不是。)

不要尝试在GHCi中输入多行声明,它会分别对待每条输入行。 只需将其保存在文件中,然后从GHCi :load文件即可。

这不是您问题的直接答案,但是使用高阶函数定义sumList的更好方法是:

sumList :: (Num a) => [a] -> [a]
sumList = tail . scanl (+) 0

还要注意,尽管您的类型签名显然被误认为= -> ,但它本来是“太多态的”,因为您的函数仅适用于“ Num类中的某些类型”列表,而不适用于“任何类型的列表”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM