2014-01-12 50 views
1

我已經有了這個函數,我想要做的是拿一個列表,將列表中的每個元素都分成'。'。並將分隔的元素放在兩個不同的列表中,我現在的問題是我收到一個錯誤,說let表達式未完成,我認爲它與沒有返回值有關,有沒有辦法繞過這個或上午我做的事情完全錯誤?旁路函數返回值要求F#

let klist = [] 
    let olist = [] 
    let listSplit list = 
    match list.Split '.' with 
    | [| x;y |] -> x :: klist, y :: olist 
    | [| x |] -> x :: klist 
    | _ -> None;; 

回答

3

看起來你想要的東西,像

let listSplit (list: string list) = 
    let acc (kl, ol) = function 
    | [| x; y |] -> (x::kl, y::ol) 
    | [| x |] -> (x::kl, ol) 

    list |> List.map (fun s -> s.Split('.')) 
    |> List.filter(fun a -> a.Length = 1 || a.Length = 2) 
    |> List.fold acc ([],[]) 

現有的代碼有幾個問題:

list沒有分裂法。 String s確實有一個Split方法,所以您可能希望將輸入列表中的每個字符串拆分,您可以使用List.map來完成該操作。

您的match表達式不檢查類型,並且每個分支都有不同的類型 - 第一個返回string list * string list,第二個string list和第三個a' option

+0

很好的答案,但有沒有簡單的方法來拆分(字符串列表*字符串列表)成兩個單獨的字符串列表? – Jacco

+1

@Jacco - 是的,你可以使用'List.unzip':http://msdn.microsoft.com/en-us/library/ee340249.aspx – Lee

+0

好吧,任何想法,爲什麼我從這段代碼中得到這個錯誤? 「let asd(list:string list * string list)= let list1,list2 = List.unzip list」這個表達式預計有 ('a *'b)列表 但這裏有類型 string list * string list – Jacco