f# - 可以在一行中优化模式匹配代码段吗?
问题描述
我想知道是否有一种方法可以在不将 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...
我想知道是否有办法在一行中很好地做到这一点?
解决方案
如果所有的用途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
,正如你在答案的后半部分中所展示的那样)。
推荐阅读
- css - 如何制作全宽 div?
- python - 只为令牌列表中的每个单词获取一个引理。
- c++ - C++中运算符优先级的混淆
- python - 如何创建列表或数组
- /
- 网页上的标签?(RobotFramework,Python)
- angular - 两个订阅链接到重构
- python - 使用Nipy在python中下采样mri T1图像
- airflow - 如何以编程方式访问 Airflow DAG 的 cron 计划?
- scala - Spark Scala:将案例类对象添加到数据框
- php - Google Mail 未在企业帐户上呈现议程
- docker - Docker - 服务的别名 DNS 条目 (CNAME)