Scala curry和Partial函数的实际示例
我是Scala的新手,最近在学咖喱。我知道什么是咖喱和部分应用功能。但我不明白为什么要使用curry而不是多个参数。因此,任何人都可以帮助我,比如说,提供一些currying。假设“currying”是指具有多个参数列表的函数定义,两个最重要的优点是:Scala curry和Partial函数的实际示例,scala,currying,Scala,Currying,我是Scala的新手,最近在学咖喱。我知道什么是咖喱和部分应用功能。但我不明白为什么要使用curry而不是多个参数。因此,任何人都可以帮助我,比如说,提供一些currying。假设“currying”是指具有多个参数列表的函数定义,两个最重要的优点是: 更好的类型推断:前面的参数列表中的参数类型可以用于后面的参数列表中的参数类型推断。这在这里起作用: def delta[A](x: A)(f: A => A): A = f(x) delta(5)(x => x) 但这里没有: de
def delta[A](x: A)(f: A => A): A = f(x)
delta(5)(x => x)
但这里没有:
def foo[A](x: A, f: A => A): A = f(x)
foo(5, x => x) // error: missing parameter type
最突出的例子可能是列表上的折叠:
val a = List(1, 2, 3)
a.foldLeft("List:"){ (s, i) => s + " " + i }
在本例中,不需要将类型归于s
和i
def f(x: Int)(y: Int, z: Int = x * x) = x + y * z // valid
f(2)(3) // works
def g(x: Int, y: Int, z: Int = x * x) = x + y * z // invalid
所谓“部分应用函数”,通常指以下内容:
List(83,223,314,56,79).map(math.min(100, _))
// output: List(83, 100, 100, 56, 79)
这里,首先使用数学函数min
创建部分应用的函数min(100,)
,然后将其传递到map
,以截断列表中大于100的所有数字
如果您的意思是“部分应用的curried函数”,那么下面是与curried函数相同的示例:
def min(x: Int)(y: Int) = x min y
List(83,223,314,56,79).map(min(100))
正如你所看到的,咖喱版本比通常的“部分应用函数”版本更短、更简洁
我不知道如何评价部分应用函数的“优点”,除了可以使用它们,不能使用它们是痛苦的。假设“currying”是指具有多个参数列表的函数定义,最重要的两个优点是:
def delta[A](x: A)(f: A => A): A = f(x)
delta(5)(x => x)
但这里没有:
def foo[A](x: A, f: A => A): A = f(x)
foo(5, x => x) // error: missing parameter type
最突出的例子可能是列表上的折叠:
val a = List(1, 2, 3)
a.foldLeft("List:"){ (s, i) => s + " " + i }
在本例中,不需要将类型归于s
和i
def f(x: Int)(y: Int, z: Int = x * x) = x + y * z // valid
f(2)(3) // works
def g(x: Int, y: Int, z: Int = x * x) = x + y * z // invalid
所谓“部分应用函数”,通常指以下内容:
List(83,223,314,56,79).map(math.min(100, _))
// output: List(83, 100, 100, 56, 79)
这里,首先使用数学函数min
创建部分应用的函数min(100,)
,然后将其传递到map
,以截断列表中大于100的所有数字
如果您的意思是“部分应用的curried函数”,那么下面是与curried函数相同的示例:
def min(x: Int)(y: Int) = x min y
List(83,223,314,56,79).map(min(100))
正如你所看到的,咖喱版本比通常的“部分应用函数”版本更短、更简洁
我不知道该怎么说部分应用函数的“优点”,除了你可以使用它们,不能使用它们是痛苦的。你是说“部分应用函数”吗?请注意,“部分函数”也是一个东西,但它完全不同。“Raman Mishra”和“user8340003”是同一个用户吗?我不是Ramanmishra@AndreyTyukin你为什么这么问?有什么问题吗?我只是编辑了它,因为它有一些语法错误。@RamanMishra我猜这是编辑加上回答下面评论中的澄清请求,我没想到会收到其他用户的任何后续问题。你是说“部分应用的功能”吗?请注意,“部分函数”也是一个东西,但它完全不同。“Raman Mishra”和“user8340003”是同一个用户吗?我不是Ramanmishra@AndreyTyukin你为什么这么问?有什么问题吗?我只是编辑了它,因为它有一些语法错误。@RamanMishra我想这是编辑加上回答下面评论中的澄清请求,我没想到会收到其他用户的任何后续问题。这是一个很好的例子,但是,我想知道一些真正的例子,或者可能是我们可以使用咖喱的商业问题。@RamanMishra我不确定你所说的“商业问题”是什么意思。
foldLeft
是一种基本的列表操作,在上千种不同的应用程序和库中反复使用,因此它尽可能真实地反映了业务。无论如何,感谢您的回答。这是一个很好的示例,我想知道一些真正的例子,或者可能是我们可以使用咖喱的商业问题。@RamanMishra我不确定你所说的“商业问题”是什么意思。foldLeft
是一种基本的列表操作,在上千种不同的应用程序和库中反复使用,因此它尽可能真实地反映了业务。无论如何,感谢您的回答。