0

例如

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 ()
4

2 回答 2

4

当你写这样的东西时:

let When true d = d

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

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

不完整的模式只有在您使用match或使用function. 该function关键字为您提供了类似于其他语言中的守卫的东西 - 但它仅适用于采用单个参数的函数。如果你When改为接受一个元组,你可以这样写:

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

或者,您可以颠倒参数的顺序(并使用柯里化),如 Vesa.AJK 的答案

于 2014-09-23T12:14:56.913 回答
2

允许这样做的事实更像是规范的一个怪癖,并且实际上您可以执行以下操作

let (a,b) = 1,2

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

let 1 |2 = 1

本质上,语法与 after match 相同,只是您不需要第一个|

旁注,这允许我在一段时间内编写的最疯狂的 F# 代码:

let 1 = 2

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

于 2014-09-23T11:44:36.750 回答