2010-02-26 9 views
1

난 수레의 배열을하고 각 튜플 각 범위의 하한 및 상한을 나타낸다 등거리의 N의 범위로 배열 깨진다 튜플의 배열을 반환 할 일반적인 숫자 함수를 구축하는 것을 시도하고있다. 생성 된 배열의 첫번째 투플의 첫번째 요소는 입력 배열의 최소이어야하고, 생성 된 배열의 마지막 튜플의 두 번째 요소는 입력 배열의 최대되어야한다.배열에서 튜플을 만드는 방법은 무엇입니까?

내 문제는 내가이 사용 패턴 매칭을 해결하기 위해 노력하고있어, 내 코드는 컴파일,하지만 아무것도 생성하지 않는 (?) 나는이 3 패턴이 일치하지 않습니다라는 경고를 할 수 있습니다. 나는 의문의 대상이다. 왜냐하면 나는 모든 사건들을 다루었다고 생각했기 때문이다. - 첫째, 마지막, 그리고 그 사이의 모든 것. 이 코드를 수정하는 방법에 대한 좋은 아이디어에 미리 감사드립니다.

let rand1000 = [| for i in 1..1000 do yield rnd.NextDouble() |] 


let intervals (arr: float array) (n : int) = 
    let L = Array.min(arr); 
    let U = Array.max(arr); 
    let increment = U - L/(float n); 
    let maxGroup = n-1; 
    [| for i in 0..maxGroup do 
      let range = match i with 
         | 0 -> L, L + increment 
         | maxGroup -> L + (float n) * increment, U 
         | _ -> L + (float n) * increment, L + (float (n + 1)) * increment 
      yield range 
    |] 

let inters = intervals rand1000; 
+1

이 무엇입니까? 숙제 같다. – gradbot

+2

아직 공식적으로 발표되지 않은 언어로 숙제를 제공하는 학교는 무엇입니까? –

+0

숙제가 아닙니다. 나는 종종 데이터의 전반적인 분포를 조사하고자하는 많은 재무 적 시계열 데이터를 가지고있다. N 개의 간격을 반환 할 수있는 일반적인 함수를 가질 수 있다면 히스토그램을 생성하는 것이 훨씬 쉬워집니다. 저는 ZedGraph와 C#을 사용해 왔고, 결국 F #으로 코드를 포팅하려고합니다. 왜냐하면 결국 내 작업을 훨씬 쉽게 할 수있는 잠재력을 알 수 있기 때문입니다. –

답변

5

maxGroup이 어떤 값과도 일치하기 때문에 세 번째 패턴은 절대 일치하지 않습니다. 매칭 블록에는 리터럴 값만 사용할 수 있으며 매우 직관적이지는 않습니다. 일치 패턴에 바인드 된 로컬 범위 변수 이름을 작성 중입니다. 다음과 같이 when 절을 사용하려고합니다.

| _ when i = maxGroup -> L + (float n) * increment, U 

이는 i가 maxGroup과 같을 때 모든 값과 간단히 일치합니다.

let dice n xs = 
    Seq.mapi (fun i x -> i/n, x) xs 
    |> Seq.groupBy fst 
    |> Seq.map (fun (_, xs) -> Seq.map snd xs) 

minMaxIntervals 기능은 다음 순서를 대조하고 dice을 사용 http://blogs.msdn.com/chrsmith/archive/2008/10/03/f-zen-the-literal-attribute.aspx

+0

+1. 나는 이것을 여러 번 물 렸습니다. 일치 * 패턴 *을 처리한다는 것을 기억하고 * 일치하지 않는 * 값이 열쇠입니다. – cfern

+0

감사합니다 -이 트릭을! –

+0

한 가지 더 - 패턴에서 "N"이 실제로 간격을 반환 할 "나는"나는 기다리고 있었다으로 대체 할 필요가 ... –

0

dice 기능 n 요소의 송이로 순서를 대조 :

크리스 스미스는 더 나은이 기능을 보여 몇 가지 예제를 가지고

: 결과 간격을 통해 minmax 기능 매핑 0
관련 문제