【发布时间】:2016-04-05 12:24:34
【问题描述】:
函数组合是否依赖部分应用程序?
这是我的理解:
观察以下函数调用重复的函数:
let updateCells (grid:Map<(int * int), Cell>) =
grid |> Map.toSeq
|> Seq.map snd
|> Seq.fold (fun grid c -> grid |> setReaction (c.X, c.Y)) grid
let mutable _cells = ObservableCollection<Cell>( grid |> Map.toSeq
|> Seq.map snd
|> Seq.toList )
let cycleHandler _ =
self.Cells <- ObservableCollection<Cell>( grid |> cycleThroughCells
|> Map.toSeq
|> Seq.map snd
|> Seq.toList )
如果您注意到,以下代码出现在所有三个函数中:
grid |> Map.toSeq
|> Seq.map snd
功能组合
在函数式编程中,我们可以将函数融合在一起,使它们成为一个函数。
为此,让我们从重复的函数序列中创建一个新函数:
let getCells = Map.toSeq >> Seq.map snd >> Seq.toList
现在,如果您细心,您会注意到我们在使用函数组合时不使用任何参数。因此,不使用网格值。这背后的原因是因为部分应用。
部分申请
我仍在学习所有这些函数式编程技术。但是,我的理解是,部分应用程序是函数式编程中的一种技术,它推迟了接受给定函数的完整参数集的需要。换句话说,部分应用是延迟接受给定函数的完整参数集的行为,其中期望最终客户端稍后将提供其余参数。至少,这是我的理解。
我们现在可以采用如下函数:
let updateCells (grid:Map<(int * int), Cell>) =
grid |> Map.toSeq
|> Seq.map snd
|> Seq.fold (fun grid c -> grid |> setReaction (c.X, c.Y)) grid
并将其重构为:
let updateCells (grid:Map<(int * int), Cell>) =
grid |> getCells
|> Seq.fold (fun grid c -> grid |> setReaction (c.X, c.Y)) grid
我对函数组合与部分应用相结合的想法是否准确?
【问题讨论】:
-
你的想法是准确的。我不会说函数组合依赖于部分应用程序,但可以使用它。我倾向于将提供的参数视为在堆栈上,并且当函数需要它们时,如果它们未定义为参数,它会将它们从堆栈中取出。
-
是的,但我尝试在组合定义中提供参数,但它无法编译。身份证...
-
你究竟做了什么没有通过编译?