Functional programming 咖喱功能故障(SML/NJ)

Functional programming 咖喱功能故障(SML/NJ),functional-programming,sml,smlnj,currying,Functional Programming,Sml,Smlnj,Currying,我们通常对计算f(i)i=mn感兴趣∑ , 函数之和 i=m到n的值f(i)。定义“sigma f m n”,计算 f(i)i=mn∑ . 这与定义“西格玛(f,m,n)”不同 我需要写一个这个函数的curry版本。我很难理解这到底是怎么回事。我理解咖喱函数是接受函数并产生函数的东西。这是一个咖喱功能的例子吗 fun myCurry f x = f(x) 至于设置我的问题,这是一个可以接受的开始吗 fun sigma f m n = 我没有进一步的了解,因为我不能真正理解别人要求我做什么。一

我们通常对计算f(i)i=mn感兴趣∑ , 函数之和 i=m到n的值f(i)。定义“sigma f m n”,计算 f(i)i=mn∑ . 这与定义“西格玛(f,m,n)”不同

我需要写一个这个函数的curry版本。我很难理解这到底是怎么回事。我理解咖喱函数是接受函数并产生函数的东西。这是一个咖喱功能的例子吗

fun myCurry f x = f(x)
至于设置我的问题,这是一个可以接受的开始吗

fun sigma f m n =

我没有进一步的了解,因为我不能真正理解别人要求我做什么。

一个curried函数实际上不是一个接受一个函数并生成另一个函数的函数。这是一个高阶函数

curried函数只是一个接受多个参数的函数,只需给它一个参数就可以部分应用

例如,关于你的西格玛问题

fun sigma (f,m,n) = ...
不是常用函数,因为它只接受一个参数(元组
(f,m,n)

但是,它是一个curry函数,因为它需要三个参数,可以这样说

val sigmasquare = sigma (fn x => x * x)
,通过给出它的第一个参数来部分应用西格玛

一个更简单的例子是

fun add (x,y) = x + y
这是一个非货币函数。要对其求值,必须为其提供参数,该参数包括
x
y
<在这种情况下,代码>添加(3,5)将计算为8

fun add x y = x + y
是同一函数的当前版本。只需给它
x
就可以对其进行部分评估。例如,
add3
将计算一个函数,该函数将在其参数中添加三个参数

通过将前面的示例视为匿名函数或lambda函数,可以更清楚地看到这一点

第一个相当于
fn(x,y)=>x+y
,它显然接受两个整数,并计算为一个整数

第二个等价于
fnx=>fny=>x+y
,它接受一个int并计算为一个函数,接受另一个int并计算为int

因此,第一种类型是
(int*int)->int
,而第二种类型是
int->int->int


希望这能在一定程度上解决问题。

我还不清楚如何将其应用于我的问题。我必须创建多个函数?是的,当前函数中的模式匹配可以用与非当前函数中完全相同的方法完成。(另外,请注意,它们被称为curry函数,而不是curry函数)。@qaphla如何为示例
fun add x y
明确指定类型。例如,我希望
x
y
为实数,在函数中,我在求和之前对它们进行四舍五入,而
add
函数返回一个整数。您好,您可以通过将函数的结果指定为实数来实现这一点,例如:add x y:real=x+y;
fun add x y = x + y