function - F#:应用一个值,就好像它是一个函数一样
问题描述
是否可以在 F# 中应用一个值,就好像它是一个函数一样?例如:
let record =
{|
Func = fun x -> x * x
Message = "hello"
|}
let message = record.Message // unsweetened field access
let unsweet = record.Func 3 // unsweetened function application
let sweet = record 3 // sweetened function application
现在,最后一行没有编译,当然:
error FS0003: This value is not a function and cannot be applied.
是否有某种语法甜味剂可以让我按照我认为合适的方式“路由”功能应用程序,同时仍然保持其正常的不加糖行为?我在想这样的魔法:
// magically apply a record as though it was a function
let () record arg =
record.Func arg
(注意:我在这个例子中使用了一条记录,但我也会对一个类感到满意。)
解决方案
我能想到的最接近的事情是使用静态解析的类型参数来解析 type 的特定属性的自定义运算符FSharpFunc
,然后使用提供的输入参数调用该函数。像这样的东西:
let record =
{|
Func = fun x -> x * x
Message = "hello"
|}
let inline (>.>) (r: ^a) v =
let f = (^a : (member Func: FSharpFunc< ^b, ^c>) r)
f v
record >.> 3 // val it : int = 9
推荐阅读
- python - 在 Chaquopy 中更改 UI 元素
- html - 如何让用户可以随意更改 html 的背景颜色?
- javascript - React 中的图片动画
- python-3.x - 如何减少任务流中的空白?
- java - 如何根据每行的某些包含值对文件行中的数据进行排序?
- r - 在具有多个密度图的函数中添加 geom_vline
- c++ - 从插槽调用 QApplication::processEvents 会导致再次调用相同的插槽
- oracle - 检查大于日期不起作用
- c++ - 在 C++ 中使用 2D 矢量时出现明显的内存泄漏
- excel - 为什么我的 Excel VBA 代码在执行 Range("K2:K" & LR).Calculate 函数时不断重启宏?