将列表中的每个数字乘以数字

use*_*850 3 haskell function list

我是haskell的新手,我正在尝试创建一个函数,它将int乘以列表的每个元素.

例:

mult 2 [2,4,6]
Run Code Online (Sandbox Code Playgroud)

返回:

[4,8,12]
Run Code Online (Sandbox Code Playgroud)

C. *_*ann 18

将问题分解为概念性步骤:

  • 您希望对列表的每个元素执行某些操作,这是map函数提供的常规操作.使用它,您可以忽略该列表,并仅考虑您需要对单个元素执行的操作.

  • 您想将两个数字相乘.在函数的任何单独使用中,其中一个数字将是常量,因此我们可以给它一个名称作为函数的参数:mult x = ....现在我们可以x视为一个常数而只关心另一个数字.

  • 另一个数字不是常数,所以你需要一个函数,而不仅仅是一个简单的表达式.Haskell为中缀运算符提供了"运算符部分" (*),因此x我们可以使用(x *).

  • 退出最后几步,你现在给出x一个名字,并创建一个你传递给它的函数map

mult x = map (x *)
Run Code Online (Sandbox Code Playgroud)

......如果你愿意的话,你现在已经完成了.但是对于初学者来说,使列表成为明确的参数可能更清楚:

mult x ys = map (x *) ys
Run Code Online (Sandbox Code Playgroud)

不过,两种形式都做同样的事情.


Kri*_*ski 9

我最初以一种有些不屑一顾的高尔夫风格回答了这个问题,让我们再试一次.我的目的是双重的:赎回自己为一个新人写一个快乐的睡眠剥夺的答案,:-),并尝试暗示自由风格的点:

mult_l = map . (*)
Run Code Online (Sandbox Code Playgroud)

那段代码做了什么?

以流水线方式思考它是有帮助的:

  • 该代码需要(*)并将其提供map.

  • 是什么类型的(*)?嗯,是的Num a => a -> a -> a.这意味着它做了什么?接受一个数字(称之为x),并给你另一个函数,这个函数将 - 如果给另一个数字(称之为y) - 计算x"时间" y.(我把"时间"放在括号中,因为它Num是一个类型类...)

  • 现在,你要撰写 (*)map.怎么map办?好吧,让我们来看看它的类型:(a -> b) -> [a] -> [b].所以现在,map将一个函数作为参数,并将该函数应用于列表的每个成员.

现在想想组合是如何运作的:(f . g) x = f (g x).

如果给出一个论点,比如2:

mult_l 2
Run Code Online (Sandbox Code Playgroud)

是真的

(map . (*)) 2
Run Code Online (Sandbox Code Playgroud)

真的只是:

map (* 2)
Run Code Online (Sandbox Code Playgroud)

现在,map需要两个参数,它需要一个函数(它说"你想让我做什么?")并且它需要一个列表(它表示"你希望我做什么?"). map然后获取该列表中的每个项目,并将该函数应用于元素.

这意味着,如果您采取类似的方式:

map (* 2) [1,2,3]
Run Code Online (Sandbox Code Playgroud)

然后map将获取列表,并查看第一个元素,然后将其乘以2,查看第二个元素等等...

所以类型map . (*)Num a => a -> [a] -> [a],因为它发生在一个数x,随后把高阶函数\x -> (* x)map.

现在挑战问题(因为你是Haskell的新手),是怎么写的map?我会给你一个提示:

  • 如果要在空列表上映射函数,则返回空列表.
  • 如果要将一个函数映射到列表以及它的尾部,则先取头,将函数应用到头部,然后对列表的其余部分执行相同的操作.

除此之外,您还可以获得递归定义map以及相关的归纳原理.

你可能会困惑的另一件事是:为什么我必须写map . (*)而不仅仅是map (*).如果你考虑一下这一点,你可能会对点自由风格稍微开悟一些

  • 事实上,职业高尔夫球手会写"地图".(*)`并完成它.达到这一点需要一些复杂性,所以感谢CAMcCann记录了大部分的旅程. (2认同)
  • 解释高尔夫FTW! (2认同)

Sat*_*vik 7

由于没有人谈论列表理解,所以只是告诉另一种做法.

mult x ys = [i*x | i <- ys]
Run Code Online (Sandbox Code Playgroud)