F# CodeWars.com Kata:对新成员进行分类

F# CodeWars.com Kata:对新成员进行分类,f#,F#,Kata描述: 西郊槌球俱乐部有两类会员,高级会员和公开会员。他们希望您提供一份申请表,告诉潜在会员他们将被列入哪个类别。 要成为资深会员,会员必须年满55岁,且残障程度大于7。在这个槌球俱乐部,障碍从-2到+26;运动员越优秀,障碍越小。 输入 输入将包括一个列表,每个列表包含两个项目。每个列表包含单个潜在成员的信息。信息由一个表示人的年龄的整数和一个表示人的残疾的整数组成。 示例输入 [[18, 20],[45, 2],[61, 12],[37, 6],[21, 21],[78, 9]]

Kata描述: 西郊槌球俱乐部有两类会员,高级会员和公开会员。他们希望您提供一份申请表,告诉潜在会员他们将被列入哪个类别。 要成为资深会员,会员必须年满55岁,且残障程度大于7。在这个槌球俱乐部,障碍从-2到+26;运动员越优秀,障碍越小。 输入 输入将包括一个列表,每个列表包含两个项目。每个列表包含单个潜在成员的信息。信息由一个表示人的年龄的整数和一个表示人的残疾的整数组成。 示例输入

[[18, 20],[45, 2],[61, 12],[37, 6],[21, 21],[78, 9]]
输出 输出将由Haskell:Open或Senior中的字符串值列表组成,说明各个成员将被置于高级还是开放类别中。 示例输出

["Open", "Open", "Senior", "Open", "Open", "Senior"] 
我已经用三种不同的语言解决了这个问题:Python、C,最后是JavaScript,我的代码如下。 C:

JavaScript:

function openOrSenior(data) { return  data.map(x => { if(x[0] >= 55 && x[1] > 7){return "Senior";}else{return "Open";} }); }
虽然我在解决这个问题时遇到了麻烦。。。 我是新来F的,我已经写了Fuchu测试。 如果可能的话,我需要一些帮助来修改我的F代码。 F: 函数参数需要采用2D数组

let OpenOrSenior _ =
    let mutable _list : List<string>  = []
    let mutable _val : string = ""
    for i in _ do 
         _val <-  if i.[0] >= 55 && i.[1] > 7 then "Senior" else "Open"
         _list <- _val :: _list
请让我知道你的想法。
提前感谢。

我调整了您的可变版本以使其正常工作。最后一行反转列表以获得正确的顺序:

let openOrSenior (input:int list list) =
  let mutable _list : List<string> = []
  let mutable _val : string = ""
  for i in input do 
    _val <-  if i.[0] >= 55 && i.[1] > 7 then "Senior" else "Open"
    _list <- _val :: _list 
  _list |> List.rev 

注意:您需要替换为;在你的输入中。逗号用于F中的元组。

我调整了可变版本以使其正常工作。最后一行反转列表以获得正确的顺序:

let openOrSenior (input:int list list) =
  let mutable _list : List<string> = []
  let mutable _val : string = ""
  for i in input do 
    _val <-  if i.[0] >= 55 && i.[1] > 7 then "Senior" else "Open"
    _list <- _val :: _list 
  _list |> List.rev 

注意:您需要替换为;在你的输入中。逗号用于F中的元组。

正如评论中所建议的那样,但逗号和元组都很好。更多开放式问题,请访问

这里有两点,首先,通过元组列表或记录,然后通过列表,对域进行更好的建模。此外,公开赛或资深赛也应该由一个受歧视的联盟来效仿。这样,您就可以对大多数惯用的和类型安全的代码进行模式匹配。但是,您可以简单地重写函数以获取列表列表,并在其上映射函数,就像您在其他示例中所做的那样:

let ageAndHandi = [[18; 20];[45; 2];[61; 12];[37; 6];[21; 21];[78; 9]]

let openOrSenior (xs:List<List<int>>) =
    xs 
    |> List.map 
       (fun (x:List<int>) -> if x.[0] >= 55 && x.[1] > 7 then "Senior" else "Open")

openOrSenior ageAndHandi //val it : string list = ["Open"; "Open"; "Senior"; "Open"; "Open"; "Senior"]
以下是实际对域建模并使用模式匹配的版本:

//record to describe a club member
type ClubMember = {   
    age: int
    handi: int
}

//Discriminated Union to describe possible sub-types of club member
type MemberType = Open | Senior

//list of club members
let ageAndHandi2 = [{age=18;handi=20}
                    {age=45;handi=2}
                    {age=61;handi=12}]

//function to return the type of club member, notice that it's not a string
//but you could do that as well 
let selectMember (mem:ClubMember) =
    match mem with 
    | x when (mem.age >= 55) && (mem.handi > 7)  -> Senior
    | _ -> Open

//pipe the member list into the selection function, which return a MemberType List
ageAndHandi2
|> List.map selectMember
//val it : MemberType list = [Open; Open; Senior]

正如评论中所建议的那样,但同时也和其他人都很好。更多开放式问题,请访问

这里有两点,首先,通过元组列表或记录,然后通过列表,对域进行更好的建模。此外,公开赛或资深赛也应该由一个受歧视的联盟来效仿。这样,您就可以对大多数惯用的和类型安全的代码进行模式匹配。但是,您可以简单地重写函数以获取列表列表,并在其上映射函数,就像您在其他示例中所做的那样:

let ageAndHandi = [[18; 20];[45; 2];[61; 12];[37; 6];[21; 21];[78; 9]]

let openOrSenior (xs:List<List<int>>) =
    xs 
    |> List.map 
       (fun (x:List<int>) -> if x.[0] >= 55 && x.[1] > 7 then "Senior" else "Open")

openOrSenior ageAndHandi //val it : string list = ["Open"; "Open"; "Senior"; "Open"; "Open"; "Senior"]
以下是实际对域建模并使用模式匹配的版本:

//record to describe a club member
type ClubMember = {   
    age: int
    handi: int
}

//Discriminated Union to describe possible sub-types of club member
type MemberType = Open | Senior

//list of club members
let ageAndHandi2 = [{age=18;handi=20}
                    {age=45;handi=2}
                    {age=61;handi=12}]

//function to return the type of club member, notice that it's not a string
//but you could do that as well 
let selectMember (mem:ClubMember) =
    match mem with 
    | x when (mem.age >= 55) && (mem.handi > 7)  -> Senior
    | _ -> Open

//pipe the member list into the selection function, which return a MemberType List
ageAndHandi2
|> List.map selectMember
//val it : MemberType list = [Open; Open; Senior]
将新成员分类

使用映射和三元运算符的JavaSvcript代码

函数openOrSeniordata{ return data.map x=>x[0]>=55&&x[1]>7?高级:打开; } 控制台。logopenOrSenior[[45,12],[55,21],[19,-2],[104,20]];//,['Open'、'Senior'、'Open'、'Senior'] console.logopenOrSenior[[3,12],[55,1],[91,-2],[54,23];//,[“打开”、“打开”、“打开”、“打开”] console.logopenOrSenior[[59,12],[55,-1],[12,-2],[12,12]];/,[‘高级’、‘公开’、‘公开’、‘公开’] 将新成员分类

使用映射和三元运算符的JavaSvcript代码

函数openOrSeniordata{ return data.map x=>x[0]>=55&&x[1]>7?高级:打开; } 控制台。logopenOrSenior[[45,12],[55,21],[19,-2],[104,20]];//,['Open'、'Senior'、'Open'、'Senior'] console.logopenOrSenior[[3,12],[55,1],[91,-2],[54,23];//,[“打开”、“打开”、“打开”、“打开”] console.logopenOrSenior[[59,12],[55,-1],[12,-2],[12,12]];/,[‘高级’、‘公开’、‘公开’、‘公开’]
它也可以作为测试列表,Expecto可能更多地被用作Fuchu的继任者。关于OpenOrSenior,您可以使用map将其重写为您的JS。你也可以用a来理解。但最好使用命名参数,而不是。同样在列表中,跳过可变的内容。有趣的是,F代码看起来比JS代码更重要哦,你可以直接使用LINQ作为你的C示例。你可以发布一个代码示例吗?让OpenOrSenior x=x |>Seq.map fun(x)->if(x.[0]>=75&&&&ux.[1]然后高级别的选项打开它不编译,我仍然会在列表中遇到错误。它也可以在测试中使用一个列表。Expecto可能更多地被用作Fuchu的继承者。关于OpenOrSenior,您可以使用map将其重写为您的JS。你也可以用a来理解。但最好使用命名参数,而不是。同样在列表中,跳过可变的内容。有趣的是,F代码看起来比JS代码更重要哦,你可以
直接使用LINQ和你的C示例一样。你能发布一个代码示例吗?让OpenOrSenior x=x |>Seq.map fun(x)->if(x.[0]>=75&&&ux.[1]然后Senior else打开它不编译我仍然会在列表中遇到错误。你能告诉我一些文档阅读的方向或一个好的教程吗?@GringoJaimes-是一个很棒的网站,你也可以试试看。最后,我对在的F轨道有了很好的体验。请你给我指点方向,让我阅读一些文档或一个好的教程好吗?@GringoJaimes-是一个很棒的网站,你也可以尝试浏览一下。最后,我已经有了很好的经验与F轨道在。
//record to describe a club member
type ClubMember = {   
    age: int
    handi: int
}

//Discriminated Union to describe possible sub-types of club member
type MemberType = Open | Senior

//list of club members
let ageAndHandi2 = [{age=18;handi=20}
                    {age=45;handi=2}
                    {age=61;handi=12}]

//function to return the type of club member, notice that it's not a string
//but you could do that as well 
let selectMember (mem:ClubMember) =
    match mem with 
    | x when (mem.age >= 55) && (mem.handi > 7)  -> Senior
    | _ -> Open

//pipe the member list into the selection function, which return a MemberType List
ageAndHandi2
|> List.map selectMember
//val it : MemberType list = [Open; Open; Senior]