[英]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.