据我所知,值定义中的显式类型参数是克服"价值限制"问题的一种方法.
还有其他需要使用它们的情况吗?
Upd:我的意思是"显式通用构造",其中type参数包含在尖括号中,即
let f<'T> x = x
Run Code Online (Sandbox Code Playgroud)
多态递归是另一种情况.也就是说,如果要在函数体中使用不同的泛型实例,则需要在定义上使用显式参数:
// perfectly balanced tree
type 'a PerfectTree =
| Single of 'a
| Node of ('a*'a) PerfectTree
// need type parameters here
let rec fold<'a,'b> (f:'a -> 'b) (g:'b->'b->'b) : 'a PerfectTree -> 'b = function
| Single a -> f a
| Node t -> t |> fold (fun (a,b) -> g (f a) (f b)) g
let sum = fold id (+)
let ten = sum (Node(Node(Single((1,2),(3,4)))))
Run Code Online (Sandbox Code Playgroud)