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)
不过,两种形式都做同样的事情.
我最初以一种有些不屑一顾的高尔夫风格回答了这个问题,让我们再试一次.我的目的是双重的:赎回自己为一个新人写一个快乐的睡眠剥夺的答案,:-),并尝试暗示自由风格的点:
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 (*).如果你考虑一下这一点,你可能会对点自由风格稍微开悟一些
| 归档时间: |
|
| 查看次数: |
3709 次 |
| 最近记录: |