重构F#函数以使用正向管道运算符

dev*_*ium 4 .net f# functional-programming

type Range = int * int
type Domain = Range array

type Gene = int
type Individual = Gene array
type Population = Individual array

let genPop (domain:Domain) popSize =
  let genInd (domain:Domain) : Individual =
    let genGene (range:Range) = genNum (fst range) (snd range)
    Array.map genGene domain
  Array.init popSize (fun _ -> genInd domain)
Run Code Online (Sandbox Code Playgroud)

所以,a Population只不过是一个Individuals 数组.每个都Individual包含一个Genes 数组,只不过是整数的别名.genNum将为我们生成一个随机整数.

我对我的genPop实施并不是特别满意.虽然它工作正常并且符合预期,但我想尝试一种使用正向管道运算符|>而不是那些子函数的实现.

关于如何继续这个的任何提示?理想情况下,我会说人们可以开始使用popSize,这将转变为一个人口,其成员个体由基因组成.问题是我们通常需要以相反的方式做事.我们首先需要创建基因,然后是个体,然后我们才能拥有人口!

你会如何实现这个(除了我这样做的方式)?也许还有其他方法对我来说目前不明显?

Jon*_*rop 5

替换fstsnd模式匹配:

let genGene (x, y) = genNum x y
Run Code Online (Sandbox Code Playgroud)

你的整个功能可以变成:

let genPop domain popSize =
  Array.init popSize (fun _ -> Array.map (fun (x, y) -> genNum x y) domain)
Run Code Online (Sandbox Code Playgroud)

要么:

let genPop domain popSize =
  [|for _ in 1..popSize ->
      [|for x, y in domain ->
          genNum x y|]|]
Run Code Online (Sandbox Code Playgroud)