想象一下,我有一个简单的键值数据存储,它为我提供了一个get和一个set,其定义如下:
def set(key: String, value: String): String = ???
def get(key: String): String = ???
def switch(value: String): String = ???
我正在尝试将以下函数转换为复合无点函数:
def swichImportant(key: String): String = {
val v = get(key)
val newV = switch(v)
set(key, newV)
}
我可以这样做:
val switchImportant2 = (k: String) => set(k, switch(get(k)))
是否可以表达此功能的无点样式?我能想到的唯一选择是传递一个既包含键又包含值的case类。
答案 0 :(得分:1)
Scala标准库缺少的部分本质上是一个功能产品:
def functionProduct[A, B, C]: (A => B, A => C) => A => (B, C) = ???
这样,您可以执行以下操作:
def switchImportant: String => String = {
functionProduct(identity[String], (get _) andThen (switch _)) andThen (set(_, _)).tupled
}
但是,尽管很明显如何以常规的scala风格进行操作,但是您仍在寻找一种无点实现product
的方法。如果确实需要,可以涉及cats,它有一个Semigroupal
类型类,可以与函数一起使用,因此可以这样定义它:
def functionProduct[A, B, C]: (A => B, A => C) => A => (B, C) = {
Semigroupal[({type F[Z] = A => Z})#F].product[B, C](_, _)
}
然后我想您已经完成了整件事。但为什么?如果您想获得免费的积分,则可能应该在做Haskell。 Scala并不是真正为它设计的,并且没有人真正以此方式编程。