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,这将转变为一个人口,其成员个体由基因组成.问题是我们通常需要以相反的方式做事.我们首先需要创建基因,然后是个体,然后我们才能拥有人口!
你会如何实现这个(除了我这样做的方式)?也许还有其他方法对我来说目前不明显?
替换fst和snd模式匹配:
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)