Functional programming 咖喱功能故障(SML/NJ)
我们通常对计算f(i)i=mn感兴趣∑ , 函数之和 i=m到n的值f(i)。定义“sigma f m n”,计算 f(i)i=mn∑ . 这与定义“西格玛(f,m,n)”不同 我需要写一个这个函数的curry版本。我很难理解这到底是怎么回事。我理解咖喱函数是接受函数并产生函数的东西。这是一个咖喱功能的例子吗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 = 我没有进一步的了解,因为我不能真正理解别人要求我做什么。一
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