1

我有这个功能:

let myFunction list (var1, var2) : bool =
    for (x,y) in list do
        match (var1, var2) with
        | (1, 11) | (2, 22) -> true
        | (_, _) ->
            if not (x = y) then
                true // error is here
            false

这将返回一个错误,指出该函数期望返回的值具有 bool 类型,而不是 unit。我想要实现的是在任何时候都返回true x != y,所以循环应该在那里停止;否则最后返回false。

4

3 回答 3

4

在 F# 中,if 语句可以返回。结果,如果你把true它自己,你需要把一个匹配的false,以便返回bool的两边if像这样

        if not (x = y) then
            true 
        else false
于 2013-10-05T07:56:51.617 回答
1

如果您想在找到匹配项后立即停止搜索,请尝试以下操作:

let myFunction list (var1, var2) : bool =
    match (var1, var2) with
    | (1, 11) | (2, 22) -> true
    | _ -> Seq.exists (fun (x, y) -> x <> y) list

Seq.exists接受一个返回布尔值的函数并遍历列表,直到找到该函数为其返回的元素true,在这种情况下,它将自己返回true。如果它在没有找到任何此类元素的情况下到达列表的末尾,它将返回false.

于 2013-10-05T08:44:21.583 回答
1

首先,“如果 x 则为真,否则为假”与“x”相同。

所以这个(你忘记了约翰指出的其他部分):

if not (x = y) then
   true
else false

可以简化为:

x <> y

你的功能有点奇怪。我想这可能是你的意思:

let myFunction list (var1, var2) =
    List.exists (fun (x, y) -> match (var1, var2) with
                               | (1, 11) | (2, 22) -> true
                               | _ -> (x <> y))
                list

可以将 var1 和 var2 的检查移出 List.exists。所以:

let myFunction list = function
                      | (1, 11) | (2, 22) -> true
                      | _ -> List.exists (fun (x, y) -> x <> y) list
于 2013-10-07T13:00:02.993 回答