2013-08-06 4 views
4

나는 [1..12]과 같은 목록을 가지고 있으며 [4..9]과 같은 조각을 얻고 싶습니다. 아무리 내가 그것을 할 수 있는지, 나는 F #으로 새로운 사람이다. 거기에 기본 제공 방법이 있는지 모르겠지만 수동 방법을 알고 싶습니다. 당신을 가정목록을 얻는 방법?

답변

4

질문에 대한 즉각적인 답변을 제공하려면 어떻게해야합니까? 패턴 일치.

패턴 일치를 사용하여 목록에서 범위를 추출하는 함수를 작성할 수 있습니다. 기본 알고리즘은 입니다. E < Min 동안 목록의 각 요소를 건너 뛰고 E < = 최대 동안 각 요소를 가져옵니다. 다음과 같은 내용 :

let range min max xs = 
    let rec skipWhile f = function 
    | x::xs when f x -> skipWhile f xs 
    | xs -> xs 
    let rec takeWhile f acc = function 
    | x::xs when f x -> takeWhile f (x::acc) xs 
    | _ -> List.rev acc 
    xs 
    |> skipWhile ((>) min) 
    |> takeWhile ((>=) max) [] 

[1..12] |> range 4 9 
> val it : int list = [4; 5; 6; 7; 8; 9] 
1

는 아마도 List 표준 모듈, 아마 그 filter 기능을 사용하려면 F 번호의 OCaml의 같은 ​​부분 집합을 사용합니다.

그렇지 않으면 일치하는 꼬리 재귀 함수가 할 수 있습니다.

8
[1..12] |> List.filter (fun x -> x >= 4 && x <= 9) 

또는

[1..12] |> Seq.skip 3 |> Seq.take 6 |> Seq.toList 

목록은 슬라이스를 지원하지 않지만 대신 배열을 사용하는 경우이 작업을 수행 할 수 있습니다

[|1..12|].[3..8] 

(3..8을 대신주의 0-9 기반 인덱싱으로 인해 4.9)