如何在函数参数中使用 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为递归映射fitems
      • 的余数的结果
      • 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
 

注意:这是一个冗长的实现。如果需要,您可以将其缩小很多。