首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(x:xs)模式Haskell逻辑

(x:xs)模式Haskell逻辑
EN

Stack Overflow用户
提问于 2016-02-08 20:10:07
回答 2查看 2.3K关注 0票数 2

假设有一个简单的函数:

代码语言:javascript
运行
复制
maximum' :: (Ord a) => [a] -> a  
maximum' [] = error "maximum of empty list"  
maximum' [x] = x  
maximum' (x:xs) = max x (maximum' xs)

我理解这个想法和(x:xs)的作用。正如在这里详细解释的那样,What do the parentheses signify in (x:xs) when pattern matching?,但是有一件小事情我无法从我的头脑中消失。既然缺点:操作符将x附加到列表xs中,那么为什么当我们使用(x: xs )??时,x是函数参数列表的第一个元素,而xs是尾元素,就好像(x:xs)在参数列表上调用头尾一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-08 20:15:27

这只是一般模式的一个实例,类型的构造函数既用于构造该类型的元素,也用于解构。如果你写

代码语言:javascript
运行
复制
data MyList a = Empty | Cons a (MyList a)

你会写

代码语言:javascript
运行
复制
maximum' :: (Ord a) => MyList a -> a  
maximum' Empty = error "maximum of empty list"  
maximum' (Cons x Empty) = x  
maximum' (Cons x xs) = max x (maximum' xs)

但是,列表实际上定义为

代码语言:javascript
运行
复制
data [a] = [] | a:as

因此,与其他数据类型一样,:用于构造和解构非空列表。

票数 7
EN

Stack Overflow用户

发布于 2016-02-08 20:15:56

cons操作符不追加,而是预置。也就是说,x : xs生成一个列表,其中包含x作为其第一个元素,xs作为其馀元素。因此,模式x : xs同样匹配一个列表,其中x作为第一个元素,xs作为其余元素。

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

https://stackoverflow.com/questions/35278382

复制
相关文章

相似问题

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