所以我在C#中有这个类:
public class Foo : IFoo {
public bool TryConnect(out Status status) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想用F#消费它.
不幸的是我不得不使用一些hackery,例如:
type FooService (foo : IFoo) =
member x.Execute() =
let mutable status = Unchecked.defaultof< ^Status>
foo.TryConnect(&status) |> ignore
(...do something with status...)
Run Code Online (Sandbox Code Playgroud)
有没有办法在这里不使用"可变"?最后,我实际上根本没有使用第一个初始化值.
(我正在使用F#2.0,但是如果你的提示只适用于F#3.0,我会很高兴听到它们.)
谢谢
我有一个简单的C#结构,我想从F#中使用它:
public struct Stat : IEquatable<Stat>
{
public ulong st_dev;
public long st_blocks;
}
Run Code Online (Sandbox Code Playgroud)
我发现这样做的方式感觉太C#ish并且对我来说是可变的:
stbuf <- new Stat()
stbuf.st_blocks <- 0
stbuf.st_dev <- 1
Run Code Online (Sandbox Code Playgroud)
更不用说在C#中我可以使用漂亮的new Stat { st_blocks = 0, st_dev = 1 }语法糖......
现在我已经转换为F#,我开始对赋值运算符过敏<-,所以有什么方法可以改善它吗?
所以我想要一个接收Tuple <int,int>数组的函数,并返回相同的类型但具有不同的值.
我想要做的是一个返回这种值的函数:
f( [1,10; 2,20; 3,40; 4,70] ) = [2,10; 3,20; 4,30]
Run Code Online (Sandbox Code Playgroud)
所以你可以看到,第一个数字基本没有变化(除了第一个项目没有被选中),但最后一个数字是当前数字与前一个数字的减法(20 - 10 = 10,40 - 20 = 20, ...).
我试图在F#中提出一个不涉及可变性的算法(使用前一个值的累加器意味着我需要一个可变变量),但我无法弄清楚.这可能吗?
如果我尝试从 cairo 网站运行此示例,则会得到:
AttributeError: 'module' object has no attribute 'cairo_font_map_get_default'
Run Code Online (Sandbox Code Playgroud)
我想我错过了一些包裹?(我在 Ubuntu 14.04 上)
但是,我试图找到我需要的开发包,我找到的唯一答案是this,它从 GTK2 堆栈中推荐了一些东西,但如果有的话,我对 GTK3 感兴趣,而不是 2。
我在F#中有以下类继承了Microsoft.AspNet.Identity.IIdentityValidator接口:
type MyValidation() =
inherit IIdentityValidator<string> with
member x.ValidateAsync (value:string) : Task<IdentityResult> =
.....
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
This 'inherit' declaration specifies the inherited type but no arguments. Consider supplying arguments, e.g. 'inherit BaseType(args)'.
Run Code Online (Sandbox Code Playgroud)
为什么以及如何解决?
我使用下面的命令生成文件列表及其 m5sum。问题是某些文件或文件夹名称中包含空格。我该如何处理这些?
find -type f -name \* | xargs md5sum
Run Code Online (Sandbox Code Playgroud) 安装完所有内容后,它无法创建模拟器。从 android studio 运行模拟器。使用 Hello world Xamarin 应用程序。它成功安装在模拟器上,但在显示白屏后停止。然后自动关闭显示此错误:
无法连接调试器。您可以在 Xamarin 诊断输出和日志上的完整异常中查看更多详细信息。
手动打开应用程序第二次也无法显示,但第三次打开它会显示只有一个标签和一个按钮的 UI。第三次它起作用了。还关闭了 android studio,以便调试器上没有冲突。
现在这里有什么问题?
我有兴趣找到F#的等价物Task.WhenAny(它处理Async<'T>而不是Task<'T>),而我发现的最接近的东西是Async.Choice,但是,此实现需要作业返回,Option<'T>而不仅仅是'T我写了自己的Async.WhenAny(从我在上找到的一些片段中进行了修改)互联网):
type internal ResultWrapper<'T>(value : 'T) =
inherit Exception()
member self.Value = value
module AsyncExtensions =
let private RaiseResult (e: ResultWrapper<'T>) =
Async.FromContinuations(fun (_, econt, _) -> econt e)
// like Async.Choice, but with no need for Option<T> types
let WhenAny<'T>(jobs: seq<Async<'T>>): Async<'T> =
let wrap job =
async {
let! res = job
return! RaiseResult <| ResultWrapper res
}
async {
try
do!
jobs
|> …Run Code Online (Sandbox Code Playgroud) 在 C# 中,可以分配公共成员来代替构造函数调用:
options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "preferred_username" }
Run Code Online (Sandbox Code Playgroud)
为了达到同样的效果,我编写了以下 F# 代码:
options.TokenValidationParameters <- (new TokenValidationParameters()) |> fun it -> (it.NameClaimType <- "preferred_username"; it)
Run Code Online (Sandbox Code Playgroud)
然而它看起来一点也不好看。
有没有更好的方法来做到这一点?apply理想的解决方案可能是像kotlin 中那样的函数?
任何帮助表示赞赏。
我有以下bash脚本(名为"env.bash")由source命令使用:
#!/bin/bash
FOO=/some/path
Run Code Online (Sandbox Code Playgroud)
然后我有以下bash脚本(名为"compile.bash"):
#!/bin/bash
if [ -z "$FOO" ]; then
echo "Need to set FOO, did you forget to source env.bash?"
exit 1
fi
./compile-something
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
source env.bash
./compile.bash
Run Code Online (Sandbox Code Playgroud)
我得到"需要设置FOO",为什么?如果我回复$ FOO,我可以看到它的价值.
单声道库是否完全可以从MS.NET引用?
反过来怎么样?
如果"sorta",那么哪些,以及有哪些限制?
我想为Linux制作一个桌面应用程序,我想知道C#/ mono是否仍适用于此.他们是否计划为GTK 3制作包装?或者是Qyoto更好的选择?另外,我想知道GTK对于Ubuntu是否是一个好主意,因为他们计划制作自己的窗口服务器.(如果我没有被误导,将使用QT ...)
任何提示都表示赞赏.