【问题标题】:F# recursive pattern matching method overrides argumentF# 递归模式匹配方法覆盖参数
【发布时间】:2016-07-22 12:47:39
【问题描述】:

在 F# 控制台应用程序中构建蛇时,我使用以下代码更新控制台窗口。

//Sets the next character in accumulator
//(i, j) are the coordinates of the game
//(px, py) are the coordinates of snake's head
let rec setConsoleChar acc i j px py =
    if i=px && j=py then
        setConsoleChar (acc+"H") (i+1) j px py
    else
        match i, j with
        | ...

但我不禁想知道(px, py) 的比较是否也可以在模式匹配块中。我尝试使用以下代码,但是当命中时,(i, j) 指针更改为指向(px, py),这导致错误的返回值只包含“H”。

match i, j with
| px, py -> setConsoleChar (acc+"H") (i+1) j px py
| ...

PS:如果有人知道简化事情的方法,请分享。

【问题讨论】:

标签: recursion f# arguments pattern-matching


【解决方案1】:

匹配中的pxpy 不是参数中给出的。
它们是匹配的 ij 并且 px 和 py 只是您选择给它们的名称(隐藏原始 px 和 py)

结果是 i 和 j 伪装成 px 和 py 你给递归调用而不是“真正的” px 和 py。

【讨论】:

    【解决方案2】:

    您应该考虑一些 cmets 和答案。也就是说,当情况很复杂并且您最终会使用很多 when 守卫时,查看active patterns 可能是个好主意。请参阅下面的示例,该示例排除了相等性检查。它的优点是使代码更具可读性(通常)。

    let (|MATCH|NOMATCH|) (i,j,px,py) = 
            if i = px && j = py then MATCH
            else
                NOMATCH
    
    let setConsoleChar  (i,j,px,py) =
            match (i,j,px,py) with
            | MATCH -> printfn "%A %A %A %A"  (i+1) j px py
            | NOMATCH -> printfn "%A" "Wot???"
    
    
    setConsoleChar (1,2,3, 4)
    setConsoleChar  (1, 0, 1, 0)
    

    “哇???”验证它:单位 = ()
    2 0 1 0 验证:单位 = ()

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 2014-12-22
      • 1970-01-01
      • 2017-05-18
      相关资源
      最近更新 更多