F# 数组和字符串切片的绑定检查
我似乎无法理解管理这两种情况的规则:F# 数组和字符串切片的绑定检查,f#,F#,我似乎无法理解管理这两种情况的规则: 1.结束索引可能比开始索引小一个,从而生成空数组/字符串。 2.如果结束索引比前面少一个,那么将开始索引放在最后一个元素后面显然是合法的 [|0..2|].[3..2];; // [||] "bar".[3..2];; // "" 考虑到案例1,绑定检查的简单实现不允许案例2: let trySlice i j (a : string) = let lastIdx = a.Length - 1 if i < 0 ||
1.结束索引可能比开始索引小一个,从而生成空数组/字符串。
2.如果结束索引比前面少一个,那么将开始索引放在最后一个元素后面显然是合法的
[|0..2|].[3..2];; // [||]
"bar".[3..2];; // ""
考虑到案例1,绑定检查的简单实现不允许案例2:
let trySlice i j (a : string) =
let lastIdx = a.Length - 1
if i < 0 || i > lastIdx || j < i - 1 || j > lastIdx then None
else Some a.[i..j]
trySlice 3 2 "bar" // None
我认为其基本原理是
a.[I..j]
是一个长度序列(j-I+1)
,因此在某种程度上,允许I=j+1
作为提取空序列的一种方式是有意义的
至于“如何继续”,如果希望trySlice
接受内置切片接受的所有情况,那么只需删除i>lastIdx
子句即可。当i=lastIdx+1
时,其他条件通过的唯一方法是如果j=lastIdx
,当i>lastIdx+1
时,j
无法通过其两个约束
作为旁注,您的写作方式:
if (failCondition || failCondition || ...) then None else Some x
出于某种原因,我觉得这与直觉背道而驰,我会将其写成:
if (successCondition && successCondition && ...) then Some x else None
非常感谢。我发现很难对此进行推理,我一生都看不出第二个条件是多余的,除了案例2。ADA用于更直观地将失败条件置于逻辑和之间,这既不适用于模式匹配(其中
|
比&
更常用),也不适用于形式为的多参数检查语句(如果条件出现)
if (failCondition || failCondition || ...) then None else Some x
if (successCondition && successCondition && ...) then Some x else None