Algorithm F#Bjorklund算法:将while循环转换为递归函数:类型约束问题

Algorithm F#Bjorklund算法:将while循环转换为递归函数:类型约束问题,algorithm,f#,type-constraints,Algorithm,F#,Type Constraints,我终于要深入f#了。很长时间的c风格命令式的家伙-但所有语言的爱好者。我正在尝试欧几里德节奏的比约克伦算法。Bjorklund:二进制字符串中直到旋转的最大相等间距1,例如11111 00000000->1001010010100 我最初的尝试基于一个漂亮的js/lodash实现。我白手起家地试过,但都被旧观念束缚住了 这是我的1:1翻译 let mutable pat = "1111100000000" // more 0 than 1 //let mutable pa

我终于要深入f#了。很长时间的c风格命令式的家伙-但所有语言的爱好者。我正在尝试欧几里德节奏的比约克伦算法。Bjorklund:二进制字符串中直到旋转的最大相等间距1,例如11111 00000000->1001010010100

我最初的尝试基于一个漂亮的js/lodash实现。我白手起家地试过,但都被旧观念束缚住了

这是我的1:1翻译

let mutable pat = "1111100000000" // more 0 than 1
//let mutable pat = "1111111100000" // more 1 than 0

// https://stackoverflow.com/questions/17101329/f-sequence-comparison
let compareSequences = Seq.compareWith Operators.compare

let mutable apat = Array.map (fun a -> [a]) ( Seq.toArray  pat )
let mutable cond = true
while cond do
    let (head, rem) = Array.partition (fun v -> (compareSequences v apat.[0]) = 0) apat
    cond <- rem.Length > 1
    match cond with
    | false -> ()
    | true ->
        for i=0 to (min head.Length rem.Length)-1 do
            apat.[i] <-apat.[i] @ apat.[^0]
            apat <- apat.[.. ^1]

let tostring (ac : char list) = (System.String.Concat(Array.ofList(ac)))
let oned = (Array.map (fun a -> tostring a) apat )
let res = Array.reduce (fun a b -> a+b)  oned
printfn "%A" res

您需要在
(bpat:list-array)
周围加上括号。否则,类型注释适用于
bjork
,而不是
bbpat

let rec bjork (bbpat:list<char> array) =
  ...
let rec bjork(bbpat:list数组)=
...

还要注意的是,计算长度和索引都是F#链表上的O(n)操作。请考虑模式匹配。

您需要在<代码>(BPAT:列表数组)周围插入括号。否则,类型注释适用于
bjork
,而不是
bpat
Yikes。我以前遇到过这种情况,只是不容易注意到优先顺序。但这一教训可能会持续下去。非常感谢。回答一下,我接受。
    let rec bjork (bbpat:list<char> array) =
        let mutable bpat = bbpat
        let (head, rem) = Array.partition (fun v -> (compareSequences v bpat.[0]) = 0) bpat
        match rem.Length > 1 with
        | false -> bpat
        | true ->
            for i=0 to (min head.Length rem.Length)-1 do
                bpat.[i] <-bpat.[i] @ bpat.[^0]
                bpat <- bpat.[.. ^1]
            bjork bpat

let rec bjork (bbpat:list<char> array) =
  ...