2017-01-06 20 views
1

У меня есть класс, который принимает функцию f: Option[Seq[Option[A]]] => Option[A]]Scala лифтинг функция, имеющая с коллекцией в качестве аргумента

case class Function[A](operator: Option[Seq[Option[A]]] => Option[A], name: String, arity: Int) 

Что я хотел бы для пользователей данного класса, чтобы иметь возможность не беспокоиться о Option фреймворк. Таким образом, пользователь передал бы функцию g: Seq[A] => A, и под капотом я бы поднял эту функцию. Подъемная часть - это то, что я не могу сделать.

Это то, что я есть (с использованием optionInstance.lift из scalaz):

object Function { 
    def apply[A](operator: Seq[A] => A) = new Function(optionInstance.lift(operator),"a", 1) 
} 

Однако это не компилируется, так как оператор лифта возвращается Option[Seq[A]] вместо Option[Seq[Option[A]]]. Как это может быть сделано?

+1

Мы не делаем то, как вы хотите сделать сопоставление. Допустим, у вас есть оператор Seq [A] => A, как бы обрабатывать вход в поднятом Seq (Some (a), None))? Я не могу думать о каноническом пути. – C4stor

+0

if 'Seq (Some (a), None))' будет оценивать значение 'None' как правильное' Option [Seq [_]] 'должно было бы вести себя правильно? –

+0

в основном пользователь предоставил бы 'Seq [A] => A', и под капотом я бы поднял его на« Option [Seq [Option [A]]] => Option [A] '. с 'Seq (Some (a), None))' оценивая 'None' –

ответ

1

Вот пример того, как конвертировать между вашими двумя прототипами:

def f[A]: Seq[A] => A = ??? 

    def g[A]: Option[Seq[Option[A]]] => Option[A] = { 
    { 
     case None => None 
     case Some(seq) if seq.exists(_.isEmpty) => None 
     case Some(seq) => Some(f(seq.flatten)) 
    } 
    } 

Вы можете использовать это, чтобы превратить ваш оператор

+0

сказать, что у меня есть' def add (x: Seq [Double]): Double = x.reduce (_ + _) ' как сделать Я использую ваш конвертер? благодаря! –

1

Если вы хотите, чтобы вернуться Опция [Seq [Опция [A]] ], вы должны сначала преобразовать свой Seq [A] в Seq [Option [A]], прежде чем делать подъем

 Смежные вопросы

  • Нет связанных вопросов^_^