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

F#签名文件中类型的通用函数定义,f#,f#-interactive,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>);; []键入ms 类型计时器=('a->'b)->'a->'b*int64;; 让我们计时:计时

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

[<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>);;
[]键入ms
类型计时器=('a->'b)->'a->'b*int64;;
让我们计时:计时器=乐趣fx->(fx),1L);;
我还可以将该类型定义放在F#签名文件(.fsi)中

模块Utils=
类型计时器=('a->'b)->'a->'b*int64
但是,当我试图在实现文件中使用该类型定义时,编译器会说“类型“timer”未定义”

[<Measure>] type ms

module Utils =
    let timeit:timer<'a,'b> = fun f x -> ((f x), 1L<ms>);;
<代码>[]ms类型 模块Utils= 让我们计时:计时器=乐趣fx->(fx),1L);;
这是预期的行为吗?

您还需要在
.fs
文件中声明您的
计时器类型


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

您还需要在
.fs
文件中声明您的
计时器


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

如果您来自C背景,签名文件看起来与头文件非常相似。事实并非如此,签名文件的功能实际上要小得多。如果您来自C语言背景,签名文件看起来与头文件非常相似。事实并非如此,签名文件的功能实际上要小得多。
[<Measure>] type ms

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