use*_*815 3 functional-programming sml smlnj currying
我们常常感兴趣的是计算f(i)i =mnΣ,i = m到n的函数值f(i)之和.定义'sigma fm n',它计算f(i)i =mnΣ.这与定义'sigma(f,m,n)'不同
我需要写一个这个函数的Curried版本.我在理解这实际上是如何工作时遇到了一些麻烦.我知道Curry函数是一个函数,它产生一个函数.这会是咖喱功能的一个例子吗?
fun myCurry f x = f(x)
Run Code Online (Sandbox Code Playgroud)
至于设置我的问题,这是一个可以接受的开始吗?
fun sigma f m n =
Run Code Online (Sandbox Code Playgroud)
我还没有进一步,因为我无法真正理解我被要求做的事情.
事实上,curried函数不是一个函数,它接受一个函数并产生另一个函数.这是一个更高阶的函数.
curried函数只是一个带有多个参数的函数,只能通过给它一个参数来部分应用.
例如,有了你的sigma问题,
fun sigma (f,m,n) = ...
Run Code Online (Sandbox Code Playgroud)
不是一个curried函数,因为它只需要一个参数(元组(f,m,n).)
fun sigma f m n = ...
Run Code Online (Sandbox Code Playgroud)
然而,它是一个curried函数,因为它需要三个参数,并且说出类似的东西是有效的
val sigmasquare = sigma (fn x => x * x)
Run Code Online (Sandbox Code Playgroud)
,通过赋予它第一个参数来部分应用sigma.
一个更简单的例子就是
fun add (x,y) = x + y
Run Code Online (Sandbox Code Playgroud)
这是一个无限制的功能.要评估它,你必须给它它的参数,包括x和y.add (3,5)在这种情况下,将评估为8.
fun add x y = x + y
Run Code Online (Sandbox Code Playgroud)
是同一个函数的curried版本.这可以通过给予它来部分评估x.例如,add 3将评估一个函数,该函数将为其参数添加三个.
通过将前面的示例看作匿名或lambda函数,可以更清楚地看到这一点.
第一个相当于fn (x,y) => x + y,显然需要两个整数并计算为int.
第二个等价于fn x => fn y => x + y,它接受一个int并计算一个函数,该函数接受另一个int并求值为int.
因此,第一种的类型是(int * int) -> int,而第二种的类型是int -> int -> int.
希望这有点清楚地说明了.
| 归档时间: |
|
| 查看次数: |
3370 次 |
| 最近记录: |