首页 > 解决方案 > 将方法调用或赋值转换为 F# 中的函数

问题描述

我想以更实用的方式使用一些面向对象的代码。我目前的方法如下:

let addControl (child: Control) (parent: Control) =
    parent.Controls.Add child
    parent

let setDock dock (control : Control) =
    control.Dock <- dock
    control

form |> addControl button

button |> setDock DockStyle.Fill

有没有更简单的方法可以定义这些函数?

如果我采用 JS 方法,我可以定义如下内容:

const fixMethod = name => value => parent => (parent[name](value), parent)
const resumeLayout = fixMethod("ResumeLayout")
resumeLayout(true)(form)

const fixAssign = name => value => parent => ({...parent, [name]: value})
const setDock = fixAssign("Dock")
setDock(DockStyle.Fill)(button)

标签: f#

解决方案


您可以在 F# 中使用各种技巧,但这些技巧都不会让您的代码变得更好——我想说的是,您可以使用的大多数技巧实际上只会使它变得更加复杂和单一。

如果底层库是这样的,那么编写一些看起来像命令式的代码并没有错。F# 确实有一些使这更容易的功能 - 例如,您可以在调用构造函数时直接指定可变属性,因此您可以设置Dock如下:

let button = new Button(Dock = DockStyle.Fill)
let form = new Form()
form.Controls.Add(button)

推荐阅读