3

私は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

4 に答える 4

4

この関数は、Haskell コンテナー関数に似ています。

Data.Map.unionWith :: (a -> a -> a) -> Map k a -> Map k a -> Map k a

一般的には、unionWith が適切な名前だと思います。より一般的な適用演算子はintersectionWith(aka. zipWith) です。

Data.Map.intersectionWith :: (a -> b -> c) -> Map k a -> Map k b -> Map k c
于 2013-06-19T13:17:36.957 に答える
-1

Haskell には、 liftM2と呼ばれるものがあります。

liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
于 2013-06-19T10:08:44.697 に答える