是否可以使用模式匹配迭代数组,就像我们对F#中的列表一样?我试过这样的事情:
type Alphabet = A | B
let rec calc (l: Alphabet []) = match l with
|l when l.[0] = A -> 5+(calc l.[1..])
|l when l.[0] = B -> 10+(calc l.[1..])
|l when l = [||] -> 0
calc [|A;A;B|]
问题似乎是循环继续并导致堆栈溢出。是否可以这样做?
答案 0 :(得分:8)
我认为你正在尝试这样做:
let toInteger = function
| A -> 5
| B -> 10
[|A; A; B|] |> Array.sumBy toInteger
在模式匹配中,您可以使用数组模式:例如,[|a; b; c|]
匹配三元素数组。但是数组没有::
运算符,所以使用数组就像使用列表一样繁琐。这是因为你不能将数组的尾部作为新数组而不复制它。
问题代码存在许多问题:
.[1..]
切片是否存在。Array.sumBy
或索引到数组的尾递归函数不同,它不需要复制数组。这里问题的核心是数组和单链接的不可变列表之间的区别。数组适合通过增加索引(内部Array.sumBy
执行)来迭代它们,而列表允许将它们的尾部视为独立列表而不进行任何复制(List.sumBy does internally
)。通常最好按照预期的方式使用每个数据结构。