我有这个功能:
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。我想要实现的是每当x != y
返回true,所以循环应该停在那里;否则最后会返回假。
答案 0 :(得分:4)
在F#中,if语句可以返回。因此,如果您单独放置true
,则需要输入匹配的false,以便if
的两边都返回bool
if not (x = y) then
true
else false
答案 1 :(得分: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
。
答案 2 :(得分:1)
首先,“if x then true else false”与“x”相同。
所以这(你忘了John指出的其他部分):
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