我对F#相当陌生,只是对任务解决方案的复杂性感到好奇。我不打算解释我正在解决的整个任务,但我想根据某个列表的所有元素是否满足某个过滤器来返回一个布尔值。我递归地浏览列表,检查元素是否满足过滤器,然后只返回结果和我在尾部调用相同函数得到的下一个结果。
在这样做的时候,我很好奇是否应该在每个步骤上检查false,因为只要运算的任何成员为false,AND运算的结果就会为false。或者F#在从AND运算本身的某个元素得到false后立即返回false?
示例:
// I have a function check : int -> bool
// check 1 returns false
check 1 && check 2
check 2
是否被执行,还是在check 1
之后立即返回值,因为它返回false?
&&
短路。如果check 1
返回false
,则check 2
永远不会被执行。
如果你允许check x
产生副作用,你可以看到这一点:
let check n =
printfn "Checking %i" n
n = 1
check 2 && check 1 // Just prints 'Checking 2'
如果要测试列表中的所有成员是否都满足谓词,则已经存在内置函数List.forall
。
示例
List.forall (fun x -> x < 10) [1..10] //false