我正在尝试使用此签名进行功能:
'a->'b->('a * 'b ->'b)->'b
我试图做这样的功能:
fun f x y z = z(x,y);
但其签名不同,它是:
'a->'b->('a * 'b ->'c)->'c
我如何使其符合要求?可能有提示吗?
您需要以某种方式限制函数的类型–您的函数太笼统。
我能想到的最简单的方法是使用一个条件,该条件在从未求值的分支中产生'b
:
- fun f x y g = if true then g(x,y) else y;
val f = fn : 'a -> 'b -> ('a * 'b -> 'b) -> 'b
您还可以使用单独的函数来注释类型。这比条件黑客更容易理解。
- fun restrict_to (y:'a) (x:'a) = x;
val restrict_to = fn : 'a -> 'a -> 'a
- fun f x y g = restrict_to y (g(x,y));
val f = fn : 'a -> 'b -> ('a * 'b -> 'b) -> 'b
我认为最少的“人工”将类似于:
fun f x y g = g (x, g (x, y))
通过两次调用g来确保g的return-type与第二个参数的类型相匹配,一次调用的结果是另一个参数的第二个参数。
但是,如果不是“作弊”,一个更简单的解决方案是只添加一个显式类型注释:
fun f x (y : 'b) g : 'b = g (x, y)