首页 > 解决方案 > 如何在 Scala 中编写柯里化函数

问题描述

是否可以在 Scala 中编写 curried 函数?例如:

def a(s1: String)(s2: String): Int = s1.length + s2.length
def b(n: Int): Boolean = n % 2 == 0

def x : String => String => Boolean = a andThen b

x("blabla")("foo") 

编辑 :

我在 Haskell 中找到了一种方法:

a :: String -> String -> Int
a s1 s2 = length s1 + length s2

b :: Int -> Bool
b n = mod n 2 == 0

c :: String -> String -> Bool 
c = curry (b . (uncurry a))

标签: scalahaskellcurryingfunction-composition

解决方案


这应该有效:

def x = a _ andThen (_ andThen b)

第一个_避免调用a并将其变为函数值。这个值是类型的String=>String=>Int,即一个接受String和返回的函数String=>Int

andThen方法的参数是一个函数,它获取原始函数的结果并对其进行修改。所以在这种情况下,它需要一个接受String=>Int并返回一个新值的函数,一个函数String=>Boolean。我们可以通过使用andThen原始函数来制作这个新函数。这采用新函数的结果a并将其与新函数组合在一起b


推荐阅读