SML作为值

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

我正在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函数?乍一看,这就是它的样子。通常,在此示例中,我对什么是变量和函数一无所知。

tuples sml lambda-calculus
2个回答
2
投票

fn (x,y) => x + yfn (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

2
投票

我不确定您在问什么。一个功能就是一个功能,一对就是一对。一对函数不是函数,因此无法应用。

但是,您可以通过定义成对的映射函数形式,类似于将列表映射起来,将一对函数对转换为成对函数: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)

© www.soinside.com 2019 - 2024. All rights reserved.