【问题标题】:Bypass function return value requirement F#绕过函数返回值要求 F#
【发布时间】:2014-01-12 15:14:50
【问题描述】:

我有这个功能,我想做的是获取一个列表,将列表中的每个元素拆分为'。'并将分离的元素放在 2 个不同的列表中,我现在的问题是我收到一个错误,说 let 表达式未完成,我认为这与没有返回值有关,有没有办法绕过这个或者我我做错了什么?

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

【问题讨论】:

    标签: f#


    【解决方案1】:

    看起来你想要类似的东西

    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 没有拆分方法。 Strings 确实有一个 Split 方法,因此您可能希望拆分输入列表中的每个字符串,您可以使用 List.map 来完成。

    您的match 表达式没有类型检查,每个分支都有不同的类型 - 第一个返回string list * string list,第二个返回string list,第三个返回a' option

    【讨论】:

    • 很好的答案,但是有没有一种简单的方法可以将(字符串列表 * 字符串列表)拆分为两个单独的字符串列表?
    • @Jacco - 是的,你可以使用 List.unzip: msdn.microsoft.com/en-us/library/ee340249.aspx
    • 好的,知道为什么我会从这段代码中得到这个错误吗? "let asd (list : string list * string list) = let list1, list2 = List.unzip list" 这个表达式应该有类型 ('a * 'b) list 但这里有类型 string list * string list
    • @Jacco - 抱歉,我以为您想将 string * string list 拆分为一对列表。你已经有一对列表,所以你无事可做。或者,您需要将list 的类型更改为(list : string * string list)
    • @Jacco - 再次抱歉,您实际上需要将列表的类型声明为(string * string) list,因为string * string list 是第一个元素是string 而第二个元素是a string list。如果你这样做,那么你以前的代码应该可以工作,你可以说let x, y = List.unzip list
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 2021-07-05
    • 2019-08-14
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多