我试图从f#调用ac#函数,其中c#函数将一个函数(委托?)作为参数,我需要这个参数为af #function.例如:
样本c#
public static void function_1(double x, ref double y)
{
y = Math.Exp(x);
}
main()
{
state s;
call_func(s, function_1)
}
Run Code Online (Sandbox Code Playgroud)
所以,call_func有一个类型的参数void fn(double, ref double)
在f#我尝试过:
let function_1 (x:double) (y:double byref) =
let y = 6.0
()
let test =
let s = new state
let ret = call_func(s, function_1)
Run Code Online (Sandbox Code Playgroud)
但是,当它应该是委托的function_1类型double -> double byref -> unit时,我得到f#具有类型的错误void fn(double, ref double).
我可以投射类型或类似的东西吗?还是有错误?
我以为我可以用引号做到这一点 - 但我看不出怎么做.
我应该只使用一个功能表和他们的名字 - 或者他们是这样做的一种方式?
谢谢.
欲了解更多信息......
我从excel调用了很多f#函数,我想知道我是否可以编写af#函数
让fs_wrapper(f_name:string)(f_params:list double)=这个位用f_params调用fname
然后使用
= fs_wrapper("my_func",3.14,2.71)
在工作表中而不是分别包装所有功能.
我有一个函数可以生成一定范围内的双精度数:
let gen_doublein =
fun mx mn -> Arb.generate<float> |> Gen.suchThat ( (>) mx ) |> Gen.suchThat ( (<) mn )
Run Code Online (Sandbox Code Playgroud)
然后是一个函数来生成其中 2 个数组:
let gen_params:Gen<double array> =
gen { let! x = gen_doublein 0.0 20000.0
let! y = gen_doublein 0.0 2000.0
return [| x;y|] }
Run Code Online (Sandbox Code Playgroud)
我放:
static member arb_params = Arb.fromGen gen_params
Run Code Online (Sandbox Code Playgroud)
在 Generator 类中并注册它。一切看起来都不错。为了测试这是否一切正常,我有:
let f2 (xs:double array) :double= exp (-2.0*xs.[0]) + xs.[1]*exp (-2.0*xs.[0])
let fcheck fn xs = fn xs > 0.0
Run Code Online (Sandbox Code Playgroud)
然后使用数组生成器“arrayOfLength”:
Check.Quick (Prop.forAll (arrayOfLength 2) …Run Code Online (Sandbox Code Playgroud) 我有2个解析器:
nexpr::Parser (Expr Double)
sexpr::Parser (Expr String)
Run Code Online (Sandbox Code Playgroud)
如果它不起作用,我如何构建一个尝试一个然后另一个的解析器?我无法弄清楚要归还什么.必须有一个聪明的方法来做到这一点.
谢谢.
编辑:
添加更多信息......
我正在学习Haskel,所以我开始:
data Expr a where
N::Double -> Expr Double
S::String -> Expr String
Add::Expr Double -> Expr Double -> Expr Double
Cat::Expr String -> Expr String -> Expr String
Run Code Online (Sandbox Code Playgroud)
然后我读了关于F-algebra(这里)的内容,所以我把它改成了:
data ExprF :: (* -> *) -> * -> * where
N::Double -> ExprF r Double
S::String -> ExprF r String
Add::r Double -> r Double -> ExprF r Double
Cat::r String -> r String -> ExprF …Run Code Online (Sandbox Code Playgroud) 可能是一个愚蠢的问题,但我如何为FSCheck生成特定大小的列表?
我可以限制使用:
let fn_of_2_check xs = (xs.Length=2) ==> fn_of_2 xs
Run Code Online (Sandbox Code Playgroud)
但是,很明显,这会丢掉很多列表.
这里只fn_of_2对长度列表进行一些测试2并返回true或false.