2010-04-29 60 views
4

有没有办法让模式匹配匹配我的值与任何负数?无论负数是什么,我只需要匹配任何负数就没有关系。OCaml:匹配任何负数

我已经完成了我想用这个简单的代码是什么:

let y = if(n < 0) then 0 else n in 
match y with 
0 -> [] 
| _ -> [x] @ clone x (n - 1) 

但我想消除if声明,只是得到它来检查它作为其他情况下,在match声明

回答

9

是,使用保护:

match n with 
    _ when n < 0 -> [] 
    | _ -> [x] @ clone x (n - 1) 
+0

哦,我明白了,我将不得不对卫兵做一些研究。谢谢! – nicotine 2010-04-29 21:47:26

0

有关键字时。由头(我现在不能测试)

让y =与n匹配 |当n < 0 - > 0 | 0 - > [] | _ - > [x] @ clone x(n - 1)

然而,即使你的例子不应该工作。一方面你返回一个int,另一方面是一个列表。

+0

没有,在比赛中两个路径清单。 '@'操作符的类型是''列表 - >'列表 - >'列表'。 – Chuck 2010-04-29 21:44:41

+0

我认为你误解了我的代码,if语句只是一个额外的代码行,用于设置匹配语句的值,当n小于0时。它只是应该做与0一样的事情,并返回空的清单。 – nicotine 2010-04-29 21:52:44

+0

哦的确如此!对于我昨天回答这个问题来说太迟了...... 我的不好:/ – 2010-04-30 13:01:20

8

你可以让你的代码干净了一点这样的:

match n < 0 with 
| true -> [] 
| false -> [x] @ clone x (n - 1) 

更妙的是:

if n < 0 then [] else [x] @ clone x (n - 1) 

一般来说,如果语句比简单逻辑测试的匹配更清晰。

虽然我们在这,我们不妨使用::代替@

if n < 0 then [] else x :: clone x (n - 1) 
+0

虽然我们正在做所有这些,但我们还引入了一个错误,其中'n = 0'映射到'0 :: clone x(-1)'而不是'[]'。试图回答这个问题通常会更好,正如在查克的回答中一样,为了避免这种情况,以及在真实情况更复杂的情况下。 – 2013-06-25 13:42:13