【发布时间】:2010-12-28 09:08:37
【问题描述】:
我想做类似的东西(Nemerle 语法)
def something =
match(STT)
| 1 with st= "Summ"
| 2 with st= "AVG" =>
$"$st : $(summbycol(counter,STT))"
在 F# 上,那么在 F# 上是真的吗?
【问题讨论】:
我想做类似的东西(Nemerle 语法)
def something =
match(STT)
| 1 with st= "Summ"
| 2 with st= "AVG" =>
$"$st : $(summbycol(counter,STT))"
在 F# 上,那么在 F# 上是真的吗?
【问题讨论】:
没有直接的支持,但你也可以模仿这样的效果:
let 1, st, _ | 2, _, st = stt, "Summ", "AVG"
sprintf "%s %a" st summbycol (counter, stt)
【讨论】:
match 或 function 关键字。我想知道这是否是官方功能?
match 或function 表达式之后的想法是一种常见的误解。函数参数也是模式,所以你可以写let f((a, b), (c, d)) = ..。这是 ML 在 Lisp 上取得的最大进步之一。
let 1, st, _ | 2, _, st = 1, "Summ", "AVG";; 和let 1, st, _ | 2, _, st = 2, "Summ", "AVG";;。
_ 替换文字 2 模式。
如果我对您的理解正确,您希望为变量分配一些值作为模式的一部分。 F# 中没有对此的直接支持,但您可以定义一个参数化的活动模式来执行此操作:
let (|Let|) v e = (v, e)
match stt with
| Let "Summ" (st, 1)
| Let "AVG" (st, 2) -> srintf "%s ..." st
Let 之后的字符串是模式的参数(并作为 v 的值传入)。然后该模式返回一个包含绑定值和原始值的元组(因此您可以匹配元组的第二个参数中的原始值。
【讨论】: