我正在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函数?乍一看,这就是它的样子。通常,在此示例中,我对什么是变量和函数一无所知。
fn (x,y) => x + y
和fn (x,y) => x - y
是函数; p
是一对功能; #1 p
和#2 p
是功能;一对不是函数。
如果您想要一个匿名函数(我假设这就是“准拉姆达微积分形式”的意思,它看起来像这样]
fn (f, g) => fn x => (f x, g x)
也就是说,首先要具有一对功能,然后是某物,然后将这两个功能应用于某物。
- (fn (f,g) => fn x => (f x, g x)) p (3,2);
val it = (5,1) : int * int
或者,如果您决定使用选择器而不是模式匹配:
- (fn fns => fn x => (#1 fns x, #2 fns x)) p (3,2);
val it = (5,1) : int * int
我不确定您在问什么。一个功能就是一个功能,一对就是一对。一对函数不是函数,因此无法应用。
但是,您可以通过定义成对的映射函数形式,类似于将列表映射起来,将一对函数对转换为成对函数:fun mapPair (f, g) (x, y) = (f x, g y)
这样,您可以做:
mapPair (p) (2, 3)
上面只是咖喱函数的简写,即返回函数的函数:Edit:
fun mapPair (f, g) = fn (x, y) => (f x, g y)
或等效地:
val mapPair = fn (f, g) => fn (x, y) => (f x, g y)