如何在Scala中表达此功能的无点样式?

时间:2018-07-19 03:43:53

标签: scala functional-programming pointfree

想象一下,我有一个简单的键值数据存储,它为我提供了一个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类。

1 个答案:

答案 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并不是真正为它设计的,并且没有人真正以此方式编程。