2014-01-12 51 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