如何在参数级别使用匹配,这可能吗?警卫

  • 本文关键字:警卫 参数 f# pattern-guards
  • 更新时间 :
  • 英文 :


例如

let When true d = d
let foo = () |> When false

所以我有我不喜欢的副作用,因为它是错误的:MatchFailureException

我知道我在这里可以有很好的副作用:let foo = if false then ()

但警告Incomplete pattern matches on this expression.告诉我可以添加我需要的内容。我只是不知道如何或是否可能?否则,为什么我甚至可以使用值作为参数?

顺便说一句:我知道我会写When b d = if b then d else (),但这个问题更一般

在haskell 中添加了解释

    let wh :: Bool -> IO () -> IO ()
        wh True f = f
        wh False f = return ()

当您编写以下内容时:

let When true d = d

您告诉F#创建一个接受两个参数的函数,并将这两个参数分别与模式trued相匹配。true模式是不完整的,并且当输入不是true值时失败。d模式是变量绑定,它总是成功的。

您可以在函数声明的参数中使用不完整的模式,这一事实并不是特别有用(但我认为您可以使用编译器无法验证的更复杂的模式)。

不完整的模式只有在使用matchfunction时才有意义。function关键字提供了类似于其他语言中的卫士的功能,但它只适用于采用单个参数的函数。如果将When更改为接受元组,则可以编写:

let When = function
  | true, f -> f()
  | false, _ -> ()

或者,您可以颠倒参数的顺序(并使用currying),如Vesa.A.J.K.的答案所示。

允许这样做的事实更多的是规范的一个怪癖,实际上是为了让你可以做之类的事情

let (a,b) = 1,2

你的问题不是特别清楚,但我认为你正在寻找类似的东西

let 1 |2 = 1

本质上,语法与匹配后相同,只是不需要第一个|

附带说明,这允许我写了一段时间以来最疯狂的F#代码:

let 1 = 2

这将编译(带有警告),但在运行时失败。

相关内容

  • 没有找到相关文章

最新更新