F#匹配->;

F#匹配->;,f#,nemerle,F#,Nemerle,我想做一些类似的东西(Nemerle语法) 关于F#那么F#是真的吗?如果我理解正确的话,您希望为变量赋值作为模式的一部分。在F#中没有对这一点的直接支持,但您可以定义一个参数化的活动模式: let (|Let|) v e = (v, e) match stt with | Let "Summ" (st, 1) | Let "AVG" (st, 2) -> srintf "%s ..." st Let之后的字符串是模式的一个参数(作为v的值传入)。然后,该模式返回一个包含绑定值和原

我想做一些类似的东西(Nemerle语法)


关于F#那么F#是真的吗?

如果我理解正确的话,您希望为变量赋值作为模式的一部分。在F#中没有对这一点的直接支持,但您可以定义一个参数化的活动模式:

let (|Let|) v e = (v, e)

match stt with 
| Let "Summ" (st, 1) 
| Let "AVG" (st, 2) -> srintf "%s ..." st

Let
之后的字符串是模式的一个参数(作为
v
的值传入)。然后,该模式返回一个包含绑定值和原始值的元组(因此您可以在元组的第二个参数中匹配原始值)。

对此没有直接支持,但您也可以模拟如下效果:

let 1, st, _ | 2, _, st = stt, "Summ", "AVG"
sprintf "%s %a" st summbycol (counter, stt)

关于F#,我学到了一件事:活动模式可以做任何事情:)@Juliet:是的,它们真的很强大。非常有趣:你可以使用模式匹配和备选方案,而无需使用
匹配
函数
关键字。我想知道这是否是一个官方特写?@wmeyer:这是一个非常正式的特写。认为模式只出现在
匹配
函数
表达式之后的想法是一种常见的误解。函数参数也是模式,因此您可以编写
让f((a,b),(c,d))=..
。这是ML相对于Lisp所取得的最大进步之一。试着让1,st,2,st=1,sum,AVG@JonHarrop有没有机会摆脱警告?“stdin(2,5):警告FS0025:此表达式的模式匹配不完整。例如,值“(0,,)”可能表示模式未涵盖的情况。”@stej您可能希望在or模式的后半部分将文字
2
模式替换为catchall
let 1, st, _ | 2, _, st = stt, "Summ", "AVG"
sprintf "%s %a" st summbycol (counter, stt)