tuples - SML 函数作为值
问题描述
我正在 SML 中对此进行试验
- val p = (fn (x,y) => x + y, fn (x,y) => x - y)
val p = (fn,fn) : (int * int -> int) * (int * int -> int)
但我一次只能评估一个
- #1(p)(3,2)
5
或者
- #2(p)(3,2)
1
为什么我不能两者都做?
- (p)(3,2)
Error: operator is not a function [tycon mismatch]...
我需要什么准 lambda 演算形式让它返回一个 2 元组,第一个位置来自x+y
lambda 函数,第二个来自x-y
lambda 函数?乍一看,这就是它会做的事情。一般来说,我不知道这个例子中的变量和函数是什么。
解决方案
我不确定你在问什么。一个函数就是一个函数,一对就是一对。一对函数不是函数,所以不能应用。
但是,您可以通过在对上定义一种映射函数的形式,将一对函数转换为对上的函数,类似于列表的映射:
fun mapPair (f, g) (x, y) = (f x, g y)
有了它,你可以这样做:
mapPair (p) (2, 3)
编辑:以上只是柯里化函数的简写,即返回函数的函数:
fun mapPair (f, g) = fn (x, y) => (f x, g y)
或等效地:
val mapPair = fn (f, g) => fn (x, y) => (f x, g y)