我是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,并计算x幂p(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.)
您可以使用以下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)
为清晰起见,您可能还需要添加类型注释.