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