У меня есть класс, который принимает функцию 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]]]
. Как это может быть сделано?
Мы не делаем то, как вы хотите сделать сопоставление. Допустим, у вас есть оператор Seq [A] => A, как бы обрабатывать вход в поднятом Seq (Some (a), None))? Я не могу думать о каноническом пути. – C4stor
if 'Seq (Some (a), None))' будет оценивать значение 'None' как правильное' Option [Seq [_]] 'должно было бы вести себя правильно? –
в основном пользователь предоставил бы 'Seq [A] => A', и под капотом я бы поднял его на« Option [Seq [Option [A]]] => Option [A] '. с 'Seq (Some (a), None))' оценивая 'None' –