【发布时间】:2017-11-20 19:30:55
【问题描述】:
我的问题是这样的: 如何定义一个函数,它在不使用类型约束的情况下接收函数,或者换句话说,无需键入 fun f1(f2:type->type) ? 我试图想出一种使用参数 f2 作为函数但它没有得到任何地方的方法。 有什么想法吗?
【问题讨论】:
我的问题是这样的: 如何定义一个函数,它在不使用类型约束的情况下接收函数,或者换句话说,无需键入 fun f1(f2:type->type) ? 我试图想出一种使用参数 f2 作为函数但它没有得到任何地方的方法。 有什么想法吗?
【问题讨论】:
你可以用一个函数做的一件事是你不能用任何其他值做的,那就是调用它。所以使用f2 作为函数意味着调用它——也就是说,将它应用到一个参数上。
例如,您可以将f1 定义为:
fun f1 f2 = f2 42
f1 的推断类型将是(int -> 'a) -> 'a(使f2 的类型int -> 'a)。
【讨论】:
('a -> 'b) -> 'b 类型的函数(这似乎是您现在所要求的)或任何类似函数的唯一方法将涉及异常或无限递归。跨度>
通过返回一个匿名函数,您可以这样做,结果函数可以接受任意函数作为输入(虽然不是很有用):
fun id f = fn x => f x
这使得id 成为一个高阶函数,它返回未修改的输入函数。 id 的类型是fn : ('a -> 'b) -> 'a -> 'b
作为它“使用”的一个例子:
- fun f x = x*x;
val f = fn : int -> int
- val g = id f;
val g = fn : int -> int
- g 5;
val it = 25 : int
一个更有趣的例子,它只适用于'a -> 'a类型的函数:
fun self_compose f = fn x => f (f x)
【讨论】:
'a -> 'b 类型的函数是一种获取 'a 类型的值并将其映射到 'b 类型的值的方法。因此,要获得第二种类型的值,您需要第一种类型的值。您似乎想找到一种直接从函数本身获取第二种类型值的方法,而无需任何实际输入。这真的没有意义。