在F中编写一个相对简单的布尔函数作为Lambda表达式#

在F中编写一个相对简单的布尔函数作为Lambda表达式#,lambda,f#,Lambda,F#,我使用F#创建了一个BST,包括一个count函数,该函数将一个通用布尔evaluate函数作为参数。此evaluate函数告诉count要统计哪些叶:例如,如果要统计所有叶,则将传递evaluate函数,如果叶存在,则返回true,如果叶不存在,则返回false 所有功能都按预期工作,但遇到了障碍。我需要创建一个evenCount函数,对包含偶数值的所有叶子进行计数,我需要将其实现为调用count传递lambda函数作为evaluate参数。但我不知道如何将一个测试整数是否为偶数的函数转换为l

我使用F#创建了一个BST,包括一个
count
函数,该函数将一个通用布尔
evaluate
函数作为参数。此
evaluate
函数告诉
count
要统计哪些叶:例如,如果要统计所有叶,则将传递
evaluate
函数,如果叶存在,则返回
true
,如果叶不存在,则返回
false

所有功能都按预期工作,但遇到了障碍。我需要创建一个
evenCount
函数,对包含偶数值的所有叶子进行计数,我需要将其实现为调用
count
传递lambda函数作为
evaluate
参数。但我不知道如何将一个测试整数是否为偶数的函数转换为lambda表达式

以下是基本功能/定义:

type BST =
| Empty
| TreeNode of int * BST * BST

let nodeTestBase = function
    | Empty -> false
    | _ -> true

let nodeTestEven = function
    | Empty -> false
    | TreeNode(value, left, right) ->
        if (value % 2 = 0) then true
        else false

let rec insert value tree =
    match tree with
    | Empty -> TreeNode(value, Empty, Empty)
    | TreeNode(hd, left, right) as node ->
        if hd = value then node
        elif value < hd then TreeNode(hd, insert value left, right)
        else TreeNode(hd, left, insert value right)

let count func tree =
    let rec loop tally = function
        | Empty -> tally
        | TreeNode(value, left, right) as node ->
            if func node then 1 + (loop 0 left) + (loop 0 right)
            else 0
    loop 0 tree
测试数据

let t = TreeNode(1,
          TreeNode(2,
            TreeNode(10,
              TreeNode(12,Empty,Empty),
              TreeNode(14,Empty,Empty)),
            TreeNode(20,
              TreeNode(22,Empty,Empty),
              TreeNode(24,Empty,Empty))),
          TreeNode(5,
            TreeNode(3,Empty,Empty),
            TreeNode(7,Empty,Empty)
          ))

let even n = n % 2 = 0
let odd n = n % 2 = 1
测试

预定义的

count even t
count odd t
内联

count (fun n-> n%2=0) t
count (fun n-> n%2=1) t
整个节点

count2 nodeTestEven t
使用内联样式的整个节点

count2 (function 
        | Empty -> false 
        | TreeNode(value, left, right) -> (value % 2 = 0))
        t
使用fun内联样式测试整个节点

count2 (fun node->node |> function 
        | Empty -> false 
        | TreeNode(value, left, right) -> (value % 2 = 0))
        t
匹配版本

count2 (fun node->
          match node with
          | Empty -> false 
          | TreeNode(value, left, right) -> (value % 2 = 1)) 
       t

这是一个好东西,但是需求特别声明我必须在函数调用中使用lambda表达式来计数。你的解决方案或多或少是我刚刚改变的。我需要弄清楚如何在count的函数调用中使用
fun
关键字内联编写
nodeTestEven
表达式。根据注释,我认为@user3776749,count2完成了您需要的内联工作。具体请参见“&x when f x->1”位,以及使用count2的额外测试,count2的签名为(BST->bool)->BST->int。我们只是传入一个内联函数来作用于节点。希望有帮助。查看模式匹配。也许活动模式也很有用。链接:。在模式匹配文档中,很容易忽略“&”的相关性。这和链接的资源非常有用,谢谢。这项作业的目的当然是为了更好地理解基本的F#编程原理,这些示例确实帮助我从不同的角度了解了事情的运作。因此,我只是运行了您的建议,运行count
(fun->n%2=0)t
,就像您设置的那样,返回4,而不是应该返回的7。某处的计票有点不对劲,但我想不出来。
count2 (fun node->node |> function 
        | Empty -> false 
        | TreeNode(value, left, right) -> (value % 2 = 0))
        t
count2 (fun node->
          match node with
          | Empty -> false 
          | TreeNode(value, left, right) -> (value % 2 = 1)) 
       t