通用函数定义作为F#签名文件中的类型

jru*_*ren 1 f# f#-interactive

我可以定义一个通用签名类型并定义一个实现该签名的函数:

[<Measure>] type ms
type timer<'a,'b> = ('a -> 'b) -> 'a -> 'b * int64<ms>;;
let timeit:timer<'a,'b> = fun f x -> ((f x), 1L<ms>);;
Run Code Online (Sandbox Code Playgroud)

我也可以将该类型定义放在F#签名文件(.fsi)中.

module Utils =
    type timer<'a,'b> = ('a -> 'b) -> 'a -> 'b * int64<ms>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在实现文件中使用该类型定义时,编译器会说"类型"计时器"未定义".

[<Measure>] type ms

module Utils =
    let timeit:timer<'a,'b> = fun f x -> ((f x), 1L<ms>);;
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

Tar*_*mil 6

您还需要timer<_, _>.fs文件中声明您的类型.

基本上,签名文件便于记录源文件的公共API,但它本身并不声明可以在源文件中使用的任何内容.如果这不是您需要的,您可以删除签名文件并仅使用源文件.