2014-01-06 2 views
2
карри

Учитывая val, который состоит из следующих (что я считаю это) type constructor with a curried function argument, F[A => B => C] ...Получение последнего типа функции

val x: F[A => B => C] = foo() // foo does not matter 

Возможно ли мне получить F[C] от x?

val y: F[C] = x...

EDIT Для контекста, я пытаюсь реализовать map3 функции от функционального программирования в Scala.

+0

'F' в данном случае является функтором? Имеет ли он заявку? Причина, по которой я спрашиваю, заключается в том, что нам понадобится какой-то способ доступа к содержащейся функции. – wheaties

+0

Да 'F' - аппликативный функтор (не ssure if different). Вот заявление: https://gist.github.com/kman007us/8277018 –

ответ

1

Единственный способ получить F[C] от F[A => B => C] - это если вы можете применить A и B. То есть вам нужно будет оценить содержащуюся функцию. Используйте apply дважды, один раз, чтобы получить B => C, а затем еще раз, чтобы получить C.

def eval(myApp: F[A => B => C])(value: F[A]): F[B => C] 
def evalAgain(myApp: F[B => C])(value: F[B]): F[C] 

, но если вы просто хотите, чтобы иметь возможность получить F[C] непосредственно из самой функции без оценки, вы SOL.

Edit:

Я считаю, что это будет выглядеть следующим образом.

def eval(myApp: F[A => B => C])(value: F[A], next: F[B])(implicit ap: Applicative[F[_]]) = ap(ap(myApp, value), next) 
+0

Спасибо, пшеницы. Не могли бы вы предоставить пример REPL для моего собственного обучения? (Возможно, я не знаком с этой функцией map3.) –

+0

Большое спасибо, @wheaties. Я не использовал 'implicit', но мой ответ (http://stackoverflow.com/questions/20962850/must-follow-curried-method) очень похож на ваш. –