Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能帮我比较一下在这个特定的例子中使用F#over C#(IP地址表达式)吗?_C#_F# - Fatal编程技术网

有人能帮我比较一下在这个特定的例子中使用F#over C#(IP地址表达式)吗?

有人能帮我比较一下在这个特定的例子中使用F#over C#(IP地址表达式)吗?,c#,f#,C#,F#,所以,我正在编写代码来解析和IP地址表达式,并将其转换为正则表达式,可以针对和IP地址字符串运行,并返回布尔响应。我用C#(OO)编写了代码,总共有110行代码。我试图比较C和F的代码量和表达能力(我是C程序员,也是F的noob)。我不想同时发布C和F,只是因为我不想把帖子弄得乱七八糟。如果需要,我会这样做 无论如何,我会举一个例子。下面是一个表达式: 192.168.0.250244-248108,51,7;127.0.0.1 我想把它转换成正则表达式: ((192\.168\.0\.(250

所以,我正在编写代码来解析和IP地址表达式,并将其转换为正则表达式,可以针对和IP地址字符串运行,并返回布尔响应。我用C#(OO)编写了代码,总共有110行代码。我试图比较C和F的代码量和表达能力(我是C程序员,也是F的noob)。我不想同时发布C和F,只是因为我不想把帖子弄得乱七八糟。如果需要,我会这样做

无论如何,我会举一个例子。下面是一个表达式:

192.168.0.250244-248108,51,7;127.0.0.1

我想把它转换成正则表达式:

((192\.168\.0\.(250 | 244 | 245 | 246 | 247 | 248 | 108 | 51 | 7))|(127\.0\.0\.1))

以下是我将遵循的一些步骤:

操作:

突破“;”192.168.0.250244-248108,51,7127.0.0.1

突破“192 168 0 250244-248108,51,7

“突破”,“250 244-248 108 51 7 以“-”号代替244 248

我想出了产生输出的F。我正在尝试通过上面列出的操作转发管道,因为我认为这样会更有表现力。有人能把这个代码做得更好吗?教我点东西:)

开放系统
让createItemArray(组:bool)(y:char)(项:字符串[])=
[|
让索引=items.Length-1
让组=索引>0&&组
如果是团体那么
收益率“(”
对于0中的i..索引
收益项目[i].ToString()
如果我是那么
产量y.ToString()
如果是团体那么
收益率“”
|] 
让breakBy(组:bool)(x:string)(y:char):string[]=
x、 拆分(y)
|>createItemArray组y
让breakItem(x:string)(y:char):string[]=breakBy false x y
设breakGroup(x:string)(y:char):string[]=breakBy true x y
let AddressExpression地址:字符串=
让生成器=新System.Text.StringBuilder“(”
断开组地址“;”
|>Array.collect(有趣的八位字节->breakItem八位字节')
|>Array.collect(有趣的选项->breakGroup选项',')
|>Array.collect(乐趣(范围:字符串)->
将(断开组范围“-”)与
|x.长度>3时的x
->将(Int32.TryParse(x[1])、Int32.TryParse(x[3])与
|((对,a),(对,b))
->[a..b]
|>Array.map(int>>字符串)
|>createItemArray错误'-'
|_124;->[|范围|]
|_124;->[|范围|]
)
|>Array.iter(趣味项目->
匹配项目
|“;”->builder.Append”)|(“
|“->builder.Append”\”
|“,”|“-”->builder.Append“|”
|->builder.Append项
|>忽略
)
builder.Append(“)”.ToString()
let address=“192.168.0.250244-248108,51,7;127.0.0.1”
地址表达式地址

这是我的63行F#(包括一个测试用例);它第一次起作用了,我觉得可读性很强。这是一个典型的解析器,后面跟着漂亮的打印机。我们怎么想

type IPs = IP[]
and IP = IP of OrParts * OrParts * OrParts * OrParts
and OrParts = Or of Part[]
and Part = Num of int | Range of int * int

let Valid(x) = if x < 0 || x > 255 then failwithf "Invalid number %d" x

let rec parseIPs (s:string) =
    s.Split [|';'|] |> Array.map parseIP
and parseIP s =
    let [|a;b;c;d|] = s.Split [|'.'|]
    IP(parseOrParts a, parseOrParts b, parseOrParts c, parseOrParts d)
and parseOrParts s =
    Or(s.Split [|','|] |> Array.map parsePart)
and parsePart s =
    if s.Contains("-") then
        let [|a;b|] = s.Split [|'-'|]
        let x,y = int a, int b
        Valid(x)
        Valid(y)
        if x > y then failwithf "Invalid range %d-%d" x y
        Range(x, y)
    else
        let x = int s
        Valid(x)
        Num(x)

let rec printIPsAsRegex ips =
    let sb = new System.Text.StringBuilder()
    let add s = sb.Append(s:string) |> ignore
    add "("
    add(System.String.Join("|", ips |> Array.map printIPAsRegex))
    add ")"
    sb.ToString()
and printIPAsRegex (IP(a, b, c, d)) : string =
    let sb = new System.Text.StringBuilder()
    let add s = sb.Append(s:string) |> ignore
    add "("
    printPartsAsRegex add a
    add "."
    printPartsAsRegex add b
    add "." 
    printPartsAsRegex add c
    add "."
    printPartsAsRegex add d
    add ")"
    sb.ToString()
and printPartsAsRegex add (Or(parts)) =
    match parts with
    | [| Num x |] -> // exactly one Num
        add(string x)
    | _ ->
        add "("
        add(System.String.Join("|", parts |> Array.collect (function
                | Num x -> [| x |]
                | Range(x,y) -> [| x..y |])
            |> Array.map (fun x -> x.ToString())))
        add ")"

let Main() =
    let ips = parseIPs "192.168.0.250,244-248,108,51,7;127.0.0.1"
    printfn "%s" (printIPsAsRegex ips)
Main()                
类型IPs=IP[]
和IP=OrParts*OrParts*OrParts*OrParts的IP
和或部分=或部分[]
和Part=int的Num | int的范围*int
设Valid(x)=如果x<0 | | x>255,则使用f“无效数字%d”x失败
让rec解析IP(s:string)=
s、 Split[|';'|]|>Array.map parseIP
和解析=
让[a;b;c;d |]=s.分开
IP(解析部分a、解析部分b、解析部分c、解析部分d)
和ParseOrps=
或(s.Split[|','|]|>Array.map parsePart)
和解析部分=
如果s.包含(“-”),则
让[| a;b |]=s.分开
设x,y=inta,intb
有效(x)
有效(y)
如果x>y,则故障为F“无效范围%d-%d”x y
射程(x,y)
其他的
设x=int
有效(x)
Num(x)
让rec printIPsAsRegex ips=
设sb=new System.Text.StringBuilder()
让我们添加s=sb.Append(s:string)|>ignore
加上“(”
添加(System.String.Join(“|”,ips |>Array.map printIPAsRegex))
加上“”
(某人)
和printipsregex(IP(a,b,c,d)):字符串=
设sb=new System.Text.StringBuilder()
让我们添加s=sb.Append(s:string)|>ignore
加上“(”
printPartsAsRegex添加一个
加上“.”
printPartsAsRegex添加b
加上“.”
printPartsAsRegex添加c
加上“.”
printPartsAsRegex添加d
加上“”
(某人)
和打印部件sasregex添加(或(部件))=
与零件匹配
|[| Num x |]->//正好一个Num
添加(字符串x)
| _ ->
加上“(”
添加(System.String.Join(“|”),parts |>Array.collect(函数
|数值x->[| x |]
|范围(x,y)->[x..y]
|>Array.map(乐趣x->x.ToString())
加上“”
让Main()=
让ips=parseIPs“192.168.0.250244-248108,51,7;127.0.0.1”
printfn“%s”(printIPsAsRegex-ips)
Main()

这是我的63行F#(包括一个测试用例);它第一次起作用了,我觉得可读性很强。这是一个典型的解析器,后面跟着漂亮的打印机。我们怎么想

type IPs = IP[]
and IP = IP of OrParts * OrParts * OrParts * OrParts
and OrParts = Or of Part[]
and Part = Num of int | Range of int * int

let Valid(x) = if x < 0 || x > 255 then failwithf "Invalid number %d" x

let rec parseIPs (s:string) =
    s.Split [|';'|] |> Array.map parseIP
and parseIP s =
    let [|a;b;c;d|] = s.Split [|'.'|]
    IP(parseOrParts a, parseOrParts b, parseOrParts c, parseOrParts d)
and parseOrParts s =
    Or(s.Split [|','|] |> Array.map parsePart)
and parsePart s =
    if s.Contains("-") then
        let [|a;b|] = s.Split [|'-'|]
        let x,y = int a, int b
        Valid(x)
        Valid(y)
        if x > y then failwithf "Invalid range %d-%d" x y
        Range(x, y)
    else
        let x = int s
        Valid(x)
        Num(x)

let rec printIPsAsRegex ips =
    let sb = new System.Text.StringBuilder()
    let add s = sb.Append(s:string) |> ignore
    add "("
    add(System.String.Join("|", ips |> Array.map printIPAsRegex))
    add ")"
    sb.ToString()
and printIPAsRegex (IP(a, b, c, d)) : string =
    let sb = new System.Text.StringBuilder()
    let add s = sb.Append(s:string) |> ignore
    add "("
    printPartsAsRegex add a
    add "."
    printPartsAsRegex add b
    add "." 
    printPartsAsRegex add c
    add "."
    printPartsAsRegex add d
    add ")"
    sb.ToString()
and printPartsAsRegex add (Or(parts)) =
    match parts with
    | [| Num x |] -> // exactly one Num
        add(string x)
    | _ ->
        add "("
        add(System.String.Join("|", parts |> Array.collect (function
                | Num x -> [| x |]
                | Range(x,y) -> [| x..y |])
            |> Array.map (fun x -> x.ToString())))
        add ")"

let Main() =
    let ips = parseIPs "192.168.0.250,244-248,108,51,7;127.0.0.1"
    printfn "%s" (printIPsAsRegex ips)
Main()                
类型IPs=IP[]
和IP=OrParts*OrParts*OrParts*OrParts的IP
和或部分=或部分[]
和Part=int的Num | int的范围*int
设Valid(x)=如果x<0 | | x>255,则使用f“无效数字%d”x失败
让rec解析IP(s:string)=
s、 Split[|';'|]|>Array.map parseIP
和解析=
让[a;b;c;d |]=s.分开
IP(解析部分a、解析部分b、解析部分c、解析部分d)
和ParseOrps=
或者(s.Split[|','|]|>Array.map parseP