f# - 将方法调用或赋值转换为 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# 确实有一些使这更容易的功能 - 例如,您可以在调用构造函数时直接指定可变属性,因此您可以设置Dock
如下:
let button = new Button(Dock = DockStyle.Fill)
let form = new Form()
form.Controls.Add(button)
推荐阅读
- latex - Overleaf - 只为第一页(而不是所有页面)设置页眉
- autotools - 什么是自动工具中的缓存变量?
- javascript - 将 Twitter Streaming API 连接到客户端
- c# - 当前上下文中不存在交互c#文本框
- mysql - 如何对重复的行进行分组并计算它们?
- c++ - 带有 GCC 的代码块上的代码块 C++ 编译错误
- dart - 在哪里设置 protoc 的路径以导入标准 Protocol Buffers
- javascript - 没有 JSON 对象的 Vuejs v-for
- javascript - 如何理解 =!{JSON.stringify(data)} 语法
- sql - 如何实现oracle查询以从laravel中的不同表中进行选择