首页 > 解决方案 > 可以在一行中优化模式匹配代码段吗?

问题描述

我想知道是否有一种方法可以在不将 h 管道传输到 calcVol 函数两次的情况下编写此行?

| h :: t when (h |> calcVol) > maxVol -> maxLoop t (h |> calcVol) 

其中 h 是一个包含三个维度的元组,而 calcVol 返回一个浮点值。

我知道我可以将 vol 值明确定义为:

| h :: t -> let vol = calcVol h if vol > maxVol then...

我想知道是否有办法在一行中很好地做到这一点?

标签: f#

解决方案


如果所有的用途vol都在箭头之前,你可以这样做:

| h :: t when let vol = (h |> calcVol) in vol > maxVol -> // Something

但是箭头左侧子句中let的赋值when不会延续到右侧。示范:

let f x = x + 5
let l = [1; 2]
match l with
| a :: b when let y = f a in y = 6 -> "Six"
| _ -> "Other"

这有效,并返回"Six". 但:

let f x = x + 5
let l = [1; 2]
match l with
| a :: b when let y = f a in y = 6 -> sprintf "Six = %d" y
| _ -> "Other"

这不起作用产生错误:

错误 FS0039:'y'未定义值或构造函数。

所以不幸的是,你不能拥有你想要的单行版本,你必须采用更长的方法(用 alet后跟 an if,正如你在答案的后半部分中所展示的那样)。


推荐阅读