首页 > 解决方案 > 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

(注意:我在这个例子中使用了一条记录,但我也会对一个类感到满意。)

标签: functionfunctional-programmingf#

解决方案


我能想到的最接近的事情是使用静态解析的类型参数来解析 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

推荐阅读