标准ML:尝试获取正确的函数签名

问题描述 投票:0回答:2

我正在尝试使用此签名进行功能:

'a->'b->('a * 'b ->'b)->'b

我试图做这样的功能:

fun f x y z = z(x,y);

但其签名不同,它是:

'a->'b->('a * 'b ->'c)->'c

我如何使其符合要求?可能有提示吗?

sml ml
2个回答
1
投票

您需要以某种方式限制函数的类型–您的函数太笼统。

我能想到的最简单的方法是使用一个条件,该条件在从未求值的分支中产生'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

0
投票

我认为最少的“人工”将类似于:

fun f x y g = g (x, g (x, y))

通过两次调用g来确保g的return-type与第二个参数的类型相匹配,一次调用的结果是另一个参数的第二个参数。

但是,如果不是“作弊”,一个更简单的解决方案是只添加一个显式类型注释:

fun f x (y : 'b) g : 'b = g (x, y)
© www.soinside.com 2019 - 2024. All rights reserved.