首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[a]究竟代表什么?

[a]究竟代表什么?
EN

Stack Overflow用户
提问于 2013-07-31 15:59:05
回答 3查看 256关注 0票数 3

我正在做一些来自“真实世界哈斯克尔”的练习。一是设计一个安全的init :: [a] -> [a]版本。

我应该从safeInit :: [a] -> Maybe [a]开始

这是我目前所拥有的。

代码语言:javascript
复制
safeInit :: [a] -> Maybe [a]
safeInit [] = Nothing
safeInit [a] = if length [a] <= 1
    then Nothing
    else Just (take (length [a] -1) [a])

在GCHi中,当测试safeInit [1,2]时,我会得到错误消息

*例外: ch4exercise.hs:(21,1)-(24,44):函数safeInit中的非穷举模式

我的印象是,[a]仅仅代表a的(任何尺寸的)列表。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-31 16:04:04

作为一种类型,[a]确实代表“任意大小的as的列表”。然而,作为一种模式,[a]代表“包含一个元素的列表,从此以后,该元素将被命名为a”。类似地,[a,b]的意思是“包含两个元素的列表,第一个元素将称为a,第二个元素将被称为b”,等等。正如您似乎已经知道的那样,[]代表“一个确切包含0元素的列表”。

这类似于将列表文字作为表达式编写的方式。也就是说,如果您编写myList = [],则myList是空列表,如果您编写myList = [x],则myList是一个包含一个元素的列表,该元素是变量x的值。

票数 14
EN

Stack Overflow用户

发布于 2013-07-31 16:05:13

[]是空列表,一个不包含任何内容的列表。A是一个完全包含一个元素的列表,该元素(而不是列表)将被标识为函数中的"a“。因此,您仍然需要考虑列表包含几个元素的情况。

如果您只使用"a“而不是"a",那么"a”将指整个列表,您可以开始将其分解为您必须处理的函数。

请注意,您已经处理了有空列表的情况,因此不需要在if语句中再次检查它。

票数 4
EN

Stack Overflow用户

发布于 2013-07-31 16:05:00

这一行有个问题:

代码语言:javascript
复制
safeInit [a] = if length [a] <= 1

在方程的左边,[a]将把一个列表与一个元素完全匹配。所以编译器可以看到,对于空列表有一个版本的safeInit,对于有一个元素的列表,有一个safeInit版本,但是对于一个元素更多的列表,没有一个版本。这就是它抱怨Non-exhaustive patterns的原因。

我觉得你真正想要的是

代码语言:javascript
复制
safeInit a = if length a <= 1
    then Nothing
    else Just (take (length a -1) a)

概括如下:

  • 在类型签名中,[a]表示任意类型a的元素列表。
  • 在模式中,[a]将一个列表与一个元素完全匹配。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17975240

复制
相关文章

相似问题

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