내 병합 정렬을위한 전체 코드와 일치를 구현하려고 할 때,이 같은보고 :이 코드는 완벽하게 잘 작동F 번호가 정렬 병합 IndexOutOfRangeException을 구조
let remove array =
Array.sub array 1 (array.Length - 1)
let rec merge (chunkA : int[]) (chunkB : int[]) =
if chunkA.Length = 0 && chunkB.Length = 0 then [||]
else if chunkA.Length = 0 || chunkB.[0] < chunkA.[0] then Array.append [| chunkB.[0] |] (merge chunkA (remove chunkB))
else Array.append [| chunkA.[0] |] (merge (remove chunkA) chunkB)
let rec mergesort (array : int[]) =
let middle = array.Length/2
let chunkA = match middle with
| 1 -> [| array.[0] |]
| _ -> mergesort [| for i in 0 .. middle - 1 -> array.[i]|]
let chunkB = match array.Length - middle with
| 1 -> [| array.[array.Length - 1] |]
| _ -> mergesort [| for i in middle .. array.Length - 1 -> array.[i]|]
merge chunkA chunkB
을, 그러나 나는 일련의 변경을 원 if 문이 merge
인 경우 match with
문으로 작동합니다. 내가 다음 코드를 구현하는 시도
는 :
내 코드를 실행let rec merge (chunkA : int[]) (chunkB : int[]) =
match chunkA.Length with
| 0 when chunkA.Length = chunkB.Length -> [||]
| 0 | _ when chunkB.[0] < chunkA.[0] -> Array.append [| chunkB.[0] |] (merge chunkA (remove chunkB))
| _ -> Array.append [| chunkA.[0] |] (merge (remove chunkA) chunkB)
는 비주얼 스튜디오는 특히 여기, 나에 "IndexOutOfRangeException"를 던졌다 :
| 0 when chunkA.Length = chunkB.Length -> [||]
를이 경우, chunkA
비었지만 chunkB
에 하나의 숫자가있었습니다. 따라서 청크 A와 B의 길이가 같지 않기 때문에 F #이이 사례를 반환하려고 시도한 이유가 무엇인지 확신 할 수 없습니다.하지만 빈 배열에 색인 오류가 발생하는 이유에 대해 혼란 스럽습니다. .
또한 F # 및 함수 프로그래밍 전반에 대해 다소 새로운 점이 있습니다. 내 코드의 구조 또는 방법론이 동등하지 않은 경우에도이 점에 대해 자유롭게 의견을 말하십시오.
또한 두께가 두꺼울 경우 나에게도 알려주세요. 표도르 Soikin는 지적
많은 덕분에, 누가 복음
디버거가 어떤 이유로 잘못된 행을 보였습니다. 오류의 실제 소스는'chunkB. [0]입니다.
또한,'| 0 | _ chunkB. [0]'두 경우 모두'when' 조건을 적용합니다. '언제'라는 작품이 종종 새로운 F # 프로그래머를 놀라게합니다 (심지어 놀라움으로 나를 잡았습니다) (http://stackoverflow.com/questions/43455264/incomplete-pattern-match-when-two-patterns-share-a -when-clause) 지난 주에, 나는 F #을 잠시 사용 해왔다. 그래서 여기서 '0'의 경우는'when chunkB. [0]
rmunn