我最近遇到了一个有趣但令人讨厌的F Sharp行为.根据[1],"F#自动缓存任何不带参数的函数的值."这似乎是一个好主意,但是当我试图想出一个包装函数来生成随机数时,它会给我带来麻烦.
作为一个例子,我在这个问题的最后代码中有两个不同的函数.第一个函数"getRand"不带参数,但不幸的是它总是返回相同的数字.第二个函数"getRand2"正如我希望每次调用时生成一个新的随机数一样,但它烦人地占用了一个无用且忽略的额外参数.
如果可能的话,我想拥有getRand2的功能但是getRand的便利性.是否有一个编译器指令或特殊关键字我可以应用于getRand,它将关闭其功能缓存功能,从而使其行为像getRand2?
谢谢,
Shawn
注意:如果答案已经出现在[1]中,请原谅我,我现在还没有看到它.
[1] - http://en.wikibooks.org/wiki/F_Sharp_Programming/Caching
(* Always returns the same number *)
let getRand =
let seed = int32(System.DateTime.Now.Ticks)
let randGen = new System.Random(seed)
randGen.Next()
(* Works as expected except I need an annoying extra parameter *)
let getRand2 dummyParam =
let seed = int32(System.DateTime.Now.Ticks)
let randGen = new System.Random(seed)
randGen.Next()
(* Outputs three "identical" numbers to console *)
System.Console.WriteLine(
"Parameterless getRand always outputs same number.")
System.Console.WriteLine(getRand)
System.Threading.Thread.Sleep(100)
System.Console.WriteLine(getRand)
System.Threading.Thread.Sleep(100)
System.Console.WriteLine(getRand)
System.Console.WriteLine()
(* Outputs three …Run Code Online (Sandbox Code Playgroud) 我最近将一个非常简单的应用程序从Windows 8开发人员预览版移植到了Windows 8 Consumer Preview.一切似乎工作正常,但现在GetTickCount()似乎不再在Windows.h或WinBase.h中定义该函数.
尽管我在文件顶部定义了这些标头:
#include <Windows.h>
#include <WinBase.h>
Run Code Online (Sandbox Code Playgroud)
我的代码行
unsigned int seed = GetTickCount() % UINT_MAX;
Run Code Online (Sandbox Code Playgroud)
仍然给我错误:
error C3861: 'GetTickCount': identifier not found
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我GetTickCount()去哪里或者我应该用什么作为替代品?
我正在评估 ML.NET 模型生成器(预览版)16.1.0.2027905。当我去训练时,构建器让我指定“训练时间(秒)”(见图):
然而,当我到达第 6 步并生成代码时,我似乎找不到指定“训练时间”的位置......
ML.NET Builder 在 ModelBuilder.cs 文件中自动为我创建此函数:
public static ITransformer TrainModel(MLContext mlContext, IDataView trainingDataView, IEstimator<ITransformer> trainingPipeline)
{
Console.WriteLine("=============== Training model ===============");
ITransformer model = trainingPipeline.Fit(trainingDataView);
Console.WriteLine("=============== End of training process ===============");
return model;
}
Run Code Online (Sandbox Code Playgroud)
但我在调试器中查看了 mlContext、trainingDataView、trainingPipeline 对象,但没有立即看到可以在哪里指定训练时间。另外,我对 3600(这是我训练的时间)进行了全局文本搜索,但我没有找到任何有趣的代码。
ML.NET 中是否有一些简单的方法可以以秒为单位指定“训练时间”?
我问这个问题是因为我想使用用户指定的训练间隔手动调用 ModelBuilder.TrainModel 。我不想总是被要求使用 ML.NET Builder GUI 来重新训练我的模型。
我如何解决这个问题以在每次非平凡调用阶乘函数时打印 helloMsg 的内容?
import Debug.Trace
factorial :: Int -> Int
factorial x =
if x <= 1 then
1
else do
let helloMsg = "Hola: x = " ++ show(x)
trace helloMsg
x * factorial (x - 1)
main = do
print (factorial 6)
Run Code Online (Sandbox Code Playgroud)
就目前而言,上面的代码无法编译。我
在第 9 行收到
无法匹配预期类型 'Int' 与实际类型 'a0 -> b0'
错误和
无法匹配预期类型 'a0 -> b0' 与实际类型 'Int'
错误
更新:我确实看过
https://wiki.haskell.org/Debugging
https://hackage.haskell.org/package/base-4.14.0.0/docs/Debug-Trace.html
但我不明白我的意思一直做错了,直到我看到下面的布拉德恩的例子。这是一个简化的示例,因为我在将跟踪应用到我正在处理的一个单独的不相关的命令行实用程序时遇到了问题。