小编b1g*_*ar5的帖子

使用带有f#函数的c#委托

我试图从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).

我可以投射类型或类似的东西吗?还是有错误?

f# c#-to-f#

6
推荐指数
1
解决办法
2269
查看次数

在f#中将函数的名称作为字符串调用

我以为我可以用引号做到这一点 - 但我看不出怎么做.

我应该只使用一个功能表和他们的名字 - 或者他们是这样做的一种方式?

谢谢.

欲了解更多信息......

我从excel调用了很多f#函数,我想知道我是否可以编写af#函数

让fs_wrapper(f_name:string)(f_params:list double)=这个位用f_params调用fname

然后使用

= fs_wrapper("my_func",3.14,2.71)

在工作表中而不是分别包装所有功能.

f# quotations

5
推荐指数
1
解决办法
1215
查看次数

使用 FSCheck 生成器

我有一个函数可以生成一定范围内的双精度数:

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)

f# fscheck

5
推荐指数
1
解决办法
2333
查看次数

在Haskell中解析Parsec

我有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)

haskell parsec

5
推荐指数
1
解决办法
549
查看次数

FSCheck生成特定大小的列表

可能是一个愚蠢的问题,但我如何为FSCheck生成特定大小的列表?

我可以限制使用:

let fn_of_2_check xs = (xs.Length=2) ==> fn_of_2 xs
Run Code Online (Sandbox Code Playgroud)

但是,很明显,这会丢掉很多列表.

这里只fn_of_2对长度列表进行一些测试2并返回truefalse.

f# fscheck

2
推荐指数
1
解决办法
654
查看次数

标签 统计

f# ×4

fscheck ×2

c#-to-f# ×1

haskell ×1

parsec ×1

quotations ×1