Haskell List理解创建功能

Anc*_*end 3 haskell

我是Haskell的新手,正在努力学习基础知识.我很难理解如何操作列表的内容.

假设我有以下列表,我想创建一个函数从列表中的每个元素中减去1,我可以简单地将x传递给函数,这将如何完成?

Prelude>let x = 1:2:3:4:5:[]
Run Code Online (Sandbox Code Playgroud)

就像是:

Prelude>subtractOne(x)
Run Code Online (Sandbox Code Playgroud)

And*_*ewC 13

(你可以1:2:3:4:5:[]更简单地写作[1,2,3,4,5]甚至[1..5].)

推导

你想使用列表推导,所以这里是:

subtractOne xs = [ x-1 | x <- xs ]
Run Code Online (Sandbox Code Playgroud)

在这里,我xs用来代表我从中减去一个的列表.

首先要注意的是x <- xs你可以读作" x取自xs".这意味着我们将xs依次取出每个数字,每次我们都会拨打这个号码x.

x-1是我们为每个人计算和返回的价值x.

有关更多示例,请在此处为每个元素添加一个元素[x+1|x<-xs]或为每个元素添加一个元素[x*x|x<-xs].

不止一个清单

让我们进一步了解列表理解,编写一个函数,找到正方形,然后是我们给它的数字的立方体,所以

> squaresAndCubes [1..5]
[1,4,9,16,25,1,8,27,64,125]
Run Code Online (Sandbox Code Playgroud)

我们需要

squaresAndCubes xs = [x^p | p <- [2,3], x <- xs]
Run Code Online (Sandbox Code Playgroud)

这意味着我们将权力取p为2然后3,并且对于每个幂,我们从中获取所有xs xs,并计算xp(x^p).

如果我们以相反的方式做到这一点会发生什么?

squaresAndCubesTogether xs = = [x^p | x <- xs, p <- [2,3]]
Run Code Online (Sandbox Code Playgroud)

我们得到了

> squaresAndCubesTogether [1..5]
[1,1,4,8,9,27,16,64,25,125]
Run Code Online (Sandbox Code Playgroud)

这需要每个x,然后直接给你两个权力.

结论 - <-位的顺序告诉您输出的顺序.

过滤

如果我们想只允许一些答案怎么办?

可以写出2到100之间的哪个数字x^y

> [x^y|x<-[2..100],y<-[2..100],x^y<100]
[4,8,16,32,64,9,27,81,16,64,25,36,49,64,81]
Run Code Online (Sandbox Code Playgroud)

在这里,我们让所有的x所有y,只要x^y<100.


由于我们对每个元素做了完全相同的操作,因此我将在实践中使用map以下方法编写:

takeOne xs = map (subtract 1) xs
Run Code Online (Sandbox Code Playgroud)

或更短的

takeOne = map (subtract 1)
Run Code Online (Sandbox Code Playgroud)

(我必须调用它,subtract 1因为它- 1会被解析为负1.)


nam*_*ess 8

您可以使用以下map功能执行此操作:

subtractOne = map (subtract 1)
Run Code Online (Sandbox Code Playgroud)

List Comprehensions的替代解决方案有点冗长:

subtractOne xs = [ x - 1 | x <- xs ]
Run Code Online (Sandbox Code Playgroud)

为清晰起见,您可能还需要添加类型注释.