gpt4 book ai didi

f# - F# 中的动态函数

转载 作者:行者123 更新时间:2023-12-04 23:38:39 30 4
gpt4 key购买 nike

对于无法使用静态类型系统表达某些功能的情况,我正在尝试探索 F# 的动态功能。因此,我正在尝试创建一个 mapN函数(例如)Option类型,但我在创建具有动态参数数量的函数时遇到问题。我试过了:

let mapN<'output> (f : obj) args =
let rec mapN' (state:obj) (args' : (obj option) list) =
match args' with
| Some x :: xs -> mapN' ((state :?> obj -> obj) x) xs
| None _ :: _ -> None
| [] -> state :?> 'output option

mapN' f args

let toObjOption (x : #obj option) =
Option.map (fun x -> x :> obj) x

let a = Some 5
let b = Some "hi"
let c = Some true

let ans = mapN<string> (fun x y z -> sprintf "%i %s %A" x y z) [a |> toObjOption; b |> toObjOption; c |> toObjOption]

(它接受传入的函数并一次应用一个参数)进行编译,但在运行时我得到以下信息:
System.InvalidCastException: Unable to cast object of type 'ans@47' to type 
'Microsoft.FSharp.Core.FSharpFunc`2[System.Object,System.Object]'.

我意识到为选项创建计算表达式或定义 map2 会更惯用。通过 map5左右,但我特别想探索 F# 的动态功能,看看这样的事情是否可行。

这只是一个不能在 F# 中完成的概念,还是我缺少一种方法?

最佳答案

我认为你只能通过反射(reflection)来采取这种方法。

但是,还有其他方法可以解决整个问题,而无需动态处理或使用您提到的其他静态选项。您可以使用 Option.apply 获得许多相同的便利。 ,您需要自己定义(或从库中获取)。此代码盗取自F# for fun and profit :

module Option =
let apply fOpt xOpt =
match fOpt,xOpt with
| Some f, Some x -> Some (f x)
| _ -> None

let resultOption =
let (<*>) = Option.apply

Some (fun x y z -> sprintf "%i %s %A" x y z)
<*> Some 5
<*> Some "hi"
<*> Some true

关于f# - F# 中的动态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394697/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com