2009-12-23 5 views
5

내 계획의 일에서 약간 녹슨에 함께이 목록을 접는, 나는이 목록을 가지고 싶습니다 "{(ushort) 5,"bla bla bla "}와 같이 작성됩니다. \ n" 나는 그것의 대부분이, 내가 제대로 폴드를 작성하는 방법 만 잘 모르겠어요 :F 번호의 기초 : 문자열

let splitter = [|","|] 
let indexes = 
    indexStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList 
let values = 
    valueStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList 

let pairs = List.zip indexes values 
printfn "%A" pairs 

let result = pairs |> Seq.fold 
    (fun acc a -> String.Format("{0}, \{(ushort){1}, \"{2}\"\}\n", 
           acc, (List.nth a 0), (List.nth a 1))) 

답변

10

누락 된 두 가지. 빈 문자열 인 접기의 초기 상태이며 F #의 튜플에 대해 목록 이해를 사용할 수 없습니다. 당신은 속도에 관심을하는 경우

let splitter = [|","|] 
let indexes = 
    indexStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList 
let values = 
    valueStr.Split(splitter, System.StringSplitOptions.None) |> Seq.toList 

let pairs = List.zip indexes values 
printfn "%A" pairs 

let result = 
    pairs 
    |> Seq.fold (fun acc (index, value) -> 
     String.Format("{0}{{(ushort){1}, \"{2}\"}},\n", acc, index, value)) "" 

fold2 버전

let result = 
    List.fold2 
     (fun acc index value -> 
      String.Format("{0}{{(ushort){1}, \"{2}\"}},\n", acc, index, value)) 
     "" 
     indexes 
     values 

당신은 새 문자열 당신이 추가 할 때마다 생성하지 않기 때문에 문자열 빌더를 사용할 수 있습니다.

let result = 
    List.fold2 
     (fun (sb:StringBuilder) index value -> 
      sb.AppendFormat("{{(ushort){0}, \"{1}\"}},\n", index, value)) 
     (StringBuilder()) 
     indexes 
     values 
    |> string 
+0

그것이 {} {및}해야한다 대신 \}와 \의를 {형식으로, 내가 그 잘못 :) – evilfred

+0

좋은 캐치를 가지고, 나는 게시물을 업데이트 정확함을 위해서. – gradbot

1

난 당신이 List.fold2을 원하는 생각합니다. 어떤 이유로 든 List 모듈의 구성원은 fold2이지만 Seq은 아닙니다. 그런 다음 zip 전체를 없앨 수 있습니다.

이름이 지정된 변수의 유형과 원하는 결과의 유형이 모두 암시 적이므로 도움이되지 않지만 문자열 목록을 누적하려고하면

행을 고려해야합니다.
let result = pairs |> Seq.fold 
    (fun prev (l, r) -> 
      String.Format("{0}, \{(ushort){1}, \"{2}\"\}\n", prev, l, r) 
    "" pairs 

내 F #을 /의 Caml 그래서 내가 잘못 인수의 순서를 가질 수있다 매우 녹슨입니다. 또한 문자열 형성은 2 차주의입니다. 내 자신의 코드에 나는이 라인을 따라 뭔가 더 갈 것입니다 :

let strings = 
    List.fold2 (fun ss l r -> 
       String.format ("\{(ushort){0}, \"{1}\"\}\n", l, r) :: ss) 
       [] indexes values 

let result = String.concat ", " strings 

이것은 당신에게 차 시간을 요하지 않을 것이다 팔로우하기 조금 쉽다. MSDN을 확인한 결과 fold2에 정확한 인수 순서가 있다고 생각합니다.

Caml이 F #이 아니라는 것을 명심하십시오. 그래서 세부 사항이나 잘못된 인수 순서가있을 수 있습니다.

8

폴드는 아마도이 작업을위한 최선의 방법이 아닙니다. 이 같은 그것의지도에 쉽게 많이 CONCAT :

let l1 = "a,b,c,d,e".Split([|','|]) 
let l2 = "1,2,3,4,5".Split([|','|]) 
let pairs = 
    Seq.zip l1 l2 
    |> Seq.map (fun (x, y) -> sprintf "(ushort)%s, \"%s\"" x y) 
    |> String.concat "\n" 
0

아마도이 :

F 번호가 때로는 더 나은 필수적, 이동과
let strBuilder = new StringBuilder() 
for (i,v) in Seq.zip indexes values do 
    strBuilder.Append(String.Format("{{(ushort){0}, \"{1}\"}},\n", i,v)) 
    |> ignore 

...

0

MAP2 또는 fold2는 올바른 방법입니다 가기. 다음은 필자가 (||>) 연산자 사용의 : 물론

let l1 = [| "a"; "b"; "c"; "d"; "e" |] 
let l2 = [| "1"; "2"; "3"; "4"; "5" |] 
let pairs = (l1, l2) ||> Seq.map2 (sprintf ("(ushort)%s, \"%s\"")) 
         |> String.concat "\n"