F#匹配 - >

cnd*_*cnd 3 f# nemerle

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

def something =
match(STT)
    | 1 with st= "Summ"
    | 2 with st= "AVG" =>
        $"$st : $(summbycol(counter,STT))"
Run Code Online (Sandbox Code Playgroud)

在F#上,F#真的如此吗?

Jon*_*rop 13

没有直接的支持,但你也可以模仿这样的效果:

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

  • @wmeyer:这是一个官方特色.模式仅出现在`match`或`function`表达式之后的想法是一种常见的误解.函数参数也是模式,所以你可以写`let f((a,b),(c,d))= ..`.这是ML在Lisp上取得的最大进步之一. (3认同)
  • 非常有趣:您可以使用模式匹配替代方案,而无需使用`match`或`function`关键字.我想知道这是否是官方特色? (2认同)

Tom*_*cek 8

如果我理解正确,你想为变量分配一些值作为模式的一部分.在F#中没有对此的直接支持,但您可以定义参数化的活动模式来执行此操作:

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

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

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

  • 关于F#,我学到了一件事:活动模式可以做任何事情:) (4认同)