【问题标题】:Refactoring F# function to make use of forward-pipe operator重构 F# 函数以使用正向管道运算符
【发布时间】:2011-09-09 10:32:36
【问题描述】:
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)

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

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

关于如何进行此操作的任何提示?理想情况下,我会说可以从popSize 开始,这将被转换为一个人口,其成员将由基因组成的个人。问题是我们通常需要以相反的方式做事。我们首先需要创建基因,然后是个体,然后我们才能拥有种群!

您将如何实现这一点(除了我这样做的方式)?也许还有其他我目前不明白的方式?

【问题讨论】:

    标签: .net f# functional-programming


    【解决方案1】:

    fstsnd 替换为模式匹配:

    let genGene (x, y) = genNum x y
    

    你的整个函数可以变成:

    let genPop domain popSize =
      Array.init popSize (fun _ -> Array.map (fun (x, y) -> genNum x y) domain)
    

    或:

    let genPop domain popSize =
      [|for _ in 1..popSize ->
          [|for x, y in domain ->
              genNum x y|]|]
    

    【讨论】:

      【解决方案2】:

      函数可以简化为(使用管道):

      let uncurry f = fun(a,b) -> f a b //Helper function
      
      let genPop (domain:Domain) popSize : Population  =
        (fun _ -> domain)
        |> Array.init popSize 
        |> Array.map ((uncurry genNum) |> Array.map)
      

      【讨论】:

        【解决方案3】:

        这是我的(第二次)尝试:

        let genPop (domain : Domain) popSize : Individual [] =
            (fun _ ->
            domain
            |> Array.map (fun (a, b) -> genNum a b))
            |> Array.init popSize
            |> Array.map (Array.copy)
        

        【讨论】:

        • 该代码与 OP 中显示的不同。这将使所有个人平等。
        • 是的,我认为 genNum 是一个功能齐全的函数。我应该注意到 gen 是 generate 的缩写 :)
        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 2023-04-01
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 2019-06-17
        • 1970-01-01
        相关资源
        最近更新 更多