Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 数组和字符串切片的绑定检查_F# - Fatal编程技术网

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