首页 > 解决方案 > 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+ylambda 函数,第二个来自x-ylambda 函数?乍一看,这就是它会做的事情。一般来说,我不知道这个例子中的变量和函数是什么。

标签: tuplessmllambda-calculus

解决方案


我不确定你在问什么。一个函数就是一个函数,一对就是一对。一对函数不是函数,所以不能应用。

但是,您可以通过在对上定义一种映射函数的形式,一对函数转换为对上的函数,类似于列表的映射:

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)

推荐阅读