刚开始使用F#。可能有人请告诉我为什么我不能通过下一步重载需要两个int参数,并返回int到我的printNext功能?据我所知类型正在排队……但这不是编译器所说的。
open System
let r = new Random()
let printNext (nextInt : int -> int -> int) =
let i = nextInt 0 100
printf "%d" i
let t x y = x + y
// compiles fine
printNext t
// compilation error
printNext r.Next
Run Code Online (Sandbox Code Playgroud)
问题是,您的printNext函数采用type的参数int -> int -> int,但是Random.Next方法具有type int * int -> int。也就是说,您希望函数使用咖喱参数,但要提供一个使用元组参数的函数。
问题不在于编译器找不到正确的重载方法,而是没有Random.Next采用咖喱参量的重载方法。
这一切似乎令人困惑,并且确实需要一些时间来适应,但是当您了解它时,使用currying是一个非常不错的工具。例如,它允许部分应用。在使用F#时,一个问题Random.Next是最初设计用于C#使用的方法,因此没有咖喱参数。
更新:我忘记了@ 3615提供的实际问题解决方案。我将其添加到此处以完成操作,不要从@ 3615的答案中获取任何内容。
这种情况下的解决方案是围绕该Random.Next方法编写包装器。如果要多次使用它,可以将其放在变量中-否则只需使用匿名函数即可。以下任何一种都可以工作
let nextRnd x y = r.Next(x, y)
printNext nextRnd
printNext (fun x y-> r.Next(x,y))
Run Code Online (Sandbox Code Playgroud)