我想写以下内容:
module A =
  type Token 
  let foo Token = 
module B =
  type Token 
  let foo Token = 
let run (m : module) =
  m.B
  |> m.foo
基本上是模块中通用的功能。有没有办法在 F# 中做到这一点?
正如 kvb 在评论中指出的那样,如果没有现实的例子,很难给出答案,因为最好的方法取决于你实际想要做什么。
在这个简单的示例中,我可能会使用 F# 接口来表示Token和添加Foo为成员。假设Foo返回一个int,你可以这样写定义:
type Token = 
  abstract Foo : unit -> int
然后,您可以使用类(非常重量级)或使用对象表达式来实现不同的标记。例如:
let tok = { new Token with
              member x.Foo () = 42 }
与您的函数对应的代码run只是Foo成员的调用:tok.Foo()