例如
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#创建一个接受两个参数的函数,并将这两个参数分别与模式true
和d
相匹配。true
模式是不完整的,并且当输入不是true
值时失败。d
模式是变量绑定,它总是成功的。
您可以在函数声明的参数中使用不完整的模式,这一事实并不是特别有用(但我认为您可以使用编译器无法验证的更复杂的模式)。
不完整的模式只有在使用match
或function
时才有意义。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
这将编译(带有警告),但在运行时失败。