如何在函数参数中使用 lambda 运算输入?
How to use a lambda operation input in a function parameter?
老实说,我什至不确定如何正确表述这个问题。
我想编写一个可以接受 lambda 运算的函数,即 (x -> x + x) 作为参数,然后应用于列表的每个条目。此任务来自 F# - exercism.io 的累积任务。
由于我没有找到任何此类函数输入的示例,因此我不知道如何使用此 lambda 输入。
高阶函数
接受lambda作为参数的函数称为“高阶函数”。这些在函数式编程中很常见。这是一个名为 apply
的简单示例,它是一个高阶函数,它采用另一个名为 f
的函数(或 lambda)并将其应用于值 x
.
// ('a -> 'b) -> 'a -> 'b
let apply f x = f x
List.map
任何将给定函数应用于集合中每个元素的高阶函数都称为“映射”。对于列表,您想要的特定函数称为 List.map
,并且已经是 provided by the F# standard library.
实现自己的地图功能
如果不允许您在本练习中使用内置 List.map
,您可以通过递归自己轻松实现相同的功能。我不想过早地给出解决方案,所以我先用伪代码描述一下:
- 给定一个函数
f
和一个 items
的列表:
- 如果
items
为空,return 为空列表
- 否则
items
不为空:
- 设
value
是将 f
应用于 items
的第一个元素的结果
- 设
rest
为递归映射f
到items
的余数的结果
- Return 一个新列表,其中包含
value
后跟 rest
。
提示:使用 pattern matching 将其转换为 F# 代码。
解决方案
let rec mymap f items =
match items with
| [] -> []
| head :: tail ->
let value = f head
let rest = mymap f tail
value :: rest
注意:这是一个冗长的实现。如果需要,您可以将其缩小很多。
老实说,我什至不确定如何正确表述这个问题。
我想编写一个可以接受 lambda 运算的函数,即 (x -> x + x) 作为参数,然后应用于列表的每个条目。此任务来自 F# - exercism.io 的累积任务。
由于我没有找到任何此类函数输入的示例,因此我不知道如何使用此 lambda 输入。
高阶函数
接受lambda作为参数的函数称为“高阶函数”。这些在函数式编程中很常见。这是一个名为 apply
的简单示例,它是一个高阶函数,它采用另一个名为 f
的函数(或 lambda)并将其应用于值 x
.
// ('a -> 'b) -> 'a -> 'b
let apply f x = f x
List.map
任何将给定函数应用于集合中每个元素的高阶函数都称为“映射”。对于列表,您想要的特定函数称为 List.map
,并且已经是 provided by the F# standard library.
实现自己的地图功能
如果不允许您在本练习中使用内置 List.map
,您可以通过递归自己轻松实现相同的功能。我不想过早地给出解决方案,所以我先用伪代码描述一下:
- 给定一个函数
f
和一个items
的列表:- 如果
items
为空,return 为空列表 - 否则
items
不为空:- 设
value
是将f
应用于items
的第一个元素的结果
- 设
rest
为递归映射f
到items
的余数的结果
- Return 一个新列表,其中包含
value
后跟rest
。
- 设
- 如果
提示:使用 pattern matching 将其转换为 F# 代码。
解决方案
let rec mymap f items = match items with | [] -> [] | head :: tail -> let value = f head let rest = mymap f tail value :: rest
注意:这是一个冗长的实现。如果需要,您可以将其缩小很多。