这是一个非常简单的问题,我只是想检查一下我正在做什么,以及我如何解释F#是有道理的.如果我有声明
let printRandom =
x = MyApplication.getRandom()
printfn "%d" x
x
Run Code Online (Sandbox Code Playgroud)
printRandomF#不是创建函数,而是运行一次,然后为其赋值.所以,现在,当我调用printRandom时,不是获取一个新的随机值并打印它,我只是得到第一次返回的内容.我可以解决这个我的定义:
let printRandom() =
x = MyApplication.getRandom()
printfn "%d" x
x
Run Code Online (Sandbox Code Playgroud)
这是在无参数函数和值之间进行区分的正确方法吗?这对我来说似乎不太理想.是否会对咖喱,成分等产生影响?
我刚刚开始使用F#,当玩弄运算符重载时,我遇到了一些我不太了解的东西.现在,我明白你不能使用,例如,+*作为重载前缀运算符; 它只能是一个中缀运算符.然而,这是我感到困惑的地方:
let (+*) a = a + a * a;;
Run Code Online (Sandbox Code Playgroud)
如果我运行它,fsi告诉我该函数(+*)是一个int->int.太好了,我可以挖掘它 - 它不是一个重载的运算符,只是一个名为的普通函数(+*).所以,如果我这样做:
printf "%d" ((+*) 6)
Run Code Online (Sandbox Code Playgroud)
正如我所料,我会得到42分.但是,如果我尝试:
printf "%d" (+*) 6
or
printf "%d" (+*)6
Run Code Online (Sandbox Code Playgroud)
它不会编译.我现在无法提出确切的错误,因为此时我无法访问F#编译器,但为什么会这样?绑定在这里发生了什么?
我在FNA的XNA框架中调用接受Nullable值的函数.现在,在C#中,你只需要调用:
foo(arg1, arg2, null, arg4)
Run Code Online (Sandbox Code Playgroud)
现在,我在F#中尝试过,但它不喜欢它.它说:"错误9类型约束不匹配.类型'a与类型System.Nullable不兼容类型'System.Nullable'没有'null'作为适当的值."
我理解为什么会发生这种情况,但它看起来真的很不方便.我现在所做的就是,为了让生活更轻松,而不是(Nullable<Rectangle>)null每次调用函数时重复键入,我只是这样做let nullRect = (Nullable<Rectangle>)null,并使用nullRect.这看起来真的很愚蠢,特别是因为我必须为我与之交互的每个可空类型执行此操作.是否有更好,更惯用的方式来处理这个问题?