我可以定义一个通用签名类型并定义一个实现该签名的函数:
[<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)
这是预期的行为吗?
您还需要timer<_, _>在.fs文件中声明您的类型.
基本上,签名文件便于记录源文件的公共API,但它本身并不声明可以在源文件中使用的任何内容.如果这不是您需要的,您可以删除签名文件并仅使用源文件.