scala - 如何在 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))
解决方案
这应该有效:
def x = a _ andThen (_ andThen b)
第一个_
避免调用a
并将其变为函数值。这个值是类型的String=>String=>Int
,即一个接受String
和返回的函数String=>Int
。
该andThen
方法的参数是一个函数,它获取原始函数的结果并对其进行修改。所以在这种情况下,它需要一个接受String=>Int
并返回一个新值的函数,一个函数String=>Boolean
。我们可以通过使用andThen
原始函数来制作这个新函数。这采用新函数的结果a
并将其与新函数组合在一起b
。
推荐阅读
- javascript - 如果文本框为空,则单击提交按钮后将用户保持在同一个 div 中
- html - 是否有以表达式为前缀的字符(如 . + =)?
- javascript - 使用 Google Actions 的 Node.js 客户端将音频流式传输到 Google Home?
- mysql - 将远程 mysql 服务器的 ssh 隧道暴露给其他容器?
- reactjs - 是否可以在不弹出我的应用程序的情况下用玩笑和酶测试我的反应应用程序?
- java - 如何将 .min() 或 .max() 作为流的方法参数?
- c# - 跟踪同一用户的 Web 服务调用量
- mongodb - MongoDB - 谁是连接背后的用户?
- javascript - 使用 Javascript 和 cookie 设置 CSS 样式
- laravel - Laravel 作业失败问题