【问题标题】:F# match with ->F# 匹配 ->
【发布时间】: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# 上是真的吗?

【问题讨论】:

    标签: f# nemerle


    【解决方案1】:

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

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

    【讨论】:

    • 非常有趣:您可以将模式匹配与备选方案一起使用,而无需使用 matchfunction 关键字。我想知道这是否是官方功能?
    • @wmeyer:这是一个非常官方的功能。模式只出现在matchfunction 表达式之后的想法是一种常见的误解。函数参数也是模式,所以你可以写let f((a, b), (c, d)) = ..。这是 ML 在 Lisp 上取得的最大进步之一。
    • @aneccodeal Vanilla OCaml。试试let 1, st, _ | 2, _, st = 1, "Summ", "AVG";;let 1, st, _ | 2, _, st = 2, "Summ", "AVG";;
    • @JonHarrop 任何机会如何摆脱警告? “stdin(2,5):警告 FS0025:此表达式的模式匹配不完整。例如,值 '(0,,)' 可能表示模式未涵盖的情况。 "
    • @stej 您可能希望在 or 模式的后半部分用包罗万象的 _ 替换文字 2 模式。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我从 F# 中学到的一件事:主动模式可以做任何事情 :)
    • @Juliet:是的,他们真的很强大。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多