2014-09-23 53 views
0

例如如何使用参数级匹配,有可能吗?逆天?

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

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

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

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

btw:我知道我可以写When b d = if b then d else()但问题更一般。

添加在Haskell解释

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

回答

2

,这是允许的事实,更多的是规范的怪癖,而且是真的,所以你可以做这样的事情

let (a,b) = 1,2 

你的问题ISN特别清楚,但我认为你正在寻找类似于

let 1 |2 = 1 

本质上的语法是一样的比赛,除非你不需要第一|

边注后,这允许的最疯狂的一段F#代码,我在一段时间中写道:

let 1 = 2 

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

+0

但我有它作为参数,我有运算符'什么时候可以显示我怎样才能使用这种语法与我的'当'? – Cynede 2014-09-23 11:59:58

+0

或...它只是没有被设计为用作参数?至少它工作,当我做'让foo =()|>当真# – Cynede 2014-09-23 12:05:47

+0

我真的不明白你在这里试图做什么。你是否想要定义一个叫做when的函数?或者只是以一种奇怪的方式使用它? – 2014-09-23 12:09:59

4

当你写类似:

let When true d = d 

你告诉F#创建一个函数有两个参数,你就对匹配模式trued,分别在两个参数。 true模式不完整,并且在输入不是true值时失败。 d模式是可变绑定,它总是成功。

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

当您使用match或当您使用function时,不完整的模式才有意义。 function关键字给你类似于其他语言的守卫 - 但它只适用于采用单一参数的函数。如果更改When接受一个元组,你可以写:

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

或者,你可以逆转的参数(和使用钻营)的顺序从Vesa.A.J.K.答案

+0

谢谢,但我主要想了解更多我通过价值传递的行为。据我所知,目前不支持按照我希望的方式工作,但是有什么方法可以让这些事情有用?还是仅仅是不完整的东西? – Cynede 2014-09-23 12:19:32

相关问题