首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于哈斯克尔中的scanl1

关于哈斯克尔中的scanl1
EN

Stack Overflow用户
提问于 2011-01-20 01:34:34
回答 3查看 709关注 0票数 0

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

我写的这个函数如下:

代码语言:javascript
运行
复制
sumlist' :: [xx]=[xx]
sumlist' []=[]
sumlist' [x]=x
sumlist' xx=scanl1 (+) [xx]

当我在GHcI中运行它时,它向我展示了我做了多个声明。那么这个函数有什么问题呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-20 02:11:40

首先,您希望将声明更改为类似于

代码语言:javascript
运行
复制
sumlist' :: [xx]->[xx]

因为sumlist‘接受xx类型的列表并返回xx类型的列表。

由于我们在调用scanl1时使用了(+),并且(+)需要Num类型,所以我们需要返回到sumlist的定义,并告诉它我们专门获取Num的列表。

代码语言:javascript
运行
复制
sumlist' :: Num xx=>[xx]->[xx]

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

代码语言:javascript
运行
复制
sumlist' :: Num xx=>[xx]->[xx]
sumlist' xx = scanl1 (+) xx

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

对于x包含1元素的情况,您需要:

代码语言:javascript
运行
复制
sumlist' [x] = x

记住,‘接受一个列表,返回一个列表列表,所以只需返回列表即可!

代码语言:javascript
运行
复制
sumlist' [x] = [x]

对于最后一种情况,你需要一个名为xx的列表,你可以得到

代码语言:javascript
运行
复制
sumlist' xx=scanl1 (+) [xx]

xx已经是一个列表,所以GHC会认为[xx]是一个列表列表,所以去掉括号就可以了

代码语言:javascript
运行
复制
sumlist' xx=scanl1 (+) xx

因此,我们修改后的代码类似于:

代码语言:javascript
运行
复制
sumlist' :: Num xx=>[xx]->[xx]
sumlist' []=[]
sumlist' [x]=[x]
sumlist' xx=scanl1 (+) xx

正如ephemient所说,如果您需要向GHCi输入多行代码,请使用:load命令。

希望这能帮到你,祝你黑客快乐:-)

票数 4
EN

Stack Overflow用户

发布于 2011-01-20 01:39:40

代码语言:javascript
运行
复制
sumlist' :: [xx]=[xx]

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

不要试图在GHCi中输入多行声明,它会单独处理每一个输入行。只需将其保存到一个文件中,然后从GHCi中:load该文件即可。

票数 0
EN

Stack Overflow用户

发布于 2011-01-20 05:56:44

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

代码语言:javascript
运行
复制
sumList :: (Num a) => [a] -> [a]
sumList = tail . scanl (+) 0

还要注意,尽管很明显将=误认为->,但您的类型签名将是“过于多态的”,因为您的函数只适用于“Num类中的某个类型”的列表,而不是“任何类型的列表”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4738609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档