【问题标题】:How to express this function point-free style in scala?如何在scala中表达这种功能无点风格?
【发布时间】:2018-12-27 01:57:08
【问题描述】:

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

是否可以表达这种功能无点风格?我能想到的唯一选择是传递一个既有键又有值的案例类。

【问题讨论】:

    标签: scala functional-programming pointfree


    【解决方案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
    }
    

    但是你一直在寻找一种方法来实现product 无点,即使很明显如何以常规的 scala 样式来实现。如果你真的想,你可以让猫参与进来,它有一个 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 并不是真正为它设计的,也没有人真正以这种方式编程。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      相关资源
      最近更新 更多