'a -> 'b 以 ml 为单位的函数

'a -> 'b function in ml

是否可以在 sml/nj 中编写一个具有签名的函数:

fn : 'a -> 'b

我最初的目的是制作一个带有签名的函数:

fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c

经过多次尝试我得到:

fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c -> 'c

但我从来没有按照要求成功制作,我意识到如果我有可能制作一个从 'a 到 'b 的函数,我就能找到解决方案。

只有两种可能的实现可以提供 'a -> 'b 功能,而且它们很少有用:

抛出异常

- fun foo a = raise Fail "error";
val foo = fn : 'a -> 'b

无限循环

- fun bar a = bar a;
val bar = fn : 'a -> 'b

我预感翻译中丢失了一些细节,因为您提供的第二种类型签名没有多大意义。

is it possible to write in sml/nj a function with the signature:

fn : 'a -> 'b

是——参见 this Whosebug question(并养成在您询问时检查重复项的习惯。;-)

my initial purpose was to make a function with the signature:

foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c

可能是这样的:

exception Done
fun foo f g x y _ = (f x; g y; raise Done)

或者像这样:

fun foo f g x y _ =
    let fun inf () = inf ()
    in f x; g y; inf () end

使这些函数与类型为 'a -> 'b 的函数相似的原因实际上是 'c 部分,因为该类型与输入类型无关,就像 'b 不相关一样与 'a 有关。 foo 中的 'as 和 'bs 实际上服务于一个目的并允许某些功能应用程序(f xg y),即使这些值不能是结果的一部分,因为您没有类型安全的方法将 'a'b 类型的值转换为 'c.

类型的值