我编写了一个Scala函数:
def liftOrIdentity[T](f: (T, T) => T) = (a: Option[T], b: Option[T]) =>
(a, b) match {
case (Some(a), None) => Some(a)
case (None, Some(b)) => Some(b)
case (Some(a), Some(b)) => Some(f(a, b))
case (None, None) => None
}
这种图案有名字吗?由于案例1和案例2的原因,它并不是一个很实用的函数器。请随意使用Haskell或Scala代码进行回答。
4条答案
按热度按时间mwg9r5ms1#
集合时为
flatten
+reduce
:ny6fqffe2#
我想起了Haskell的
Control.Applicative
中的Alternative
类型类:Alternative
的任何示例的函数的一般版本可能如下所示:对于Scala,我认为最接近
Alternative
的类比是Scalaz中的ApplicativePlus
类型类。我承认
liftOrAlternative
不是一个好名字。读了Twan van Laarhoven的回答后,我认为他提出的unionWith
在表达函数的实际功能方面要好得多。e0bqpujr3#
此函数类似于Haskell容器函数
总的来说,我认为Union With是一个很好的名字。更常用的应用运算符是
intersectionWith
(又名。zipWith
)。edqdpe6u4#
在Haskell中,有一种类似的东西被称为liftM2。