Нет разницы между
Apply[Option].map(Some(1))(intToString)
и
Apply[Option].ap(Some(intToString))(Some(1))
Оба Some("1")
.
Но есть большая разница между map
и ap
.
map
происходит от класса типа Functor
и имеет подпись
def map[A, B](fa: F[A])(f: A => B): F[B]
ap
происходит от класса типа Apply
и имеет подпись
def ap[A, B](ff: F[A => B])(fa: F[A]): F[B]
Таким образом, map
применяет функцию A => B
к значению в контексте F[A]
, а ap
применяет функцию F[A => B]
в контексте к значению в контексте F[A]
.
Например
Apply[List].map(List(1, 2))(intToString)
List("1", "2")
в то время как
Apply[List].ap(List(intToString, (i: Int) => intToString(i) + "a"))(List(1, 2))
is List("1", "2", "1a", "2a")
.
Apply[Option].map(fx)(f)
может быть None
, только когда fx
равно None
, а Apply[Option].ap(ff)(fx)
может быть None
, когда fx
равно None
или ff
равно None
.
person
Dmytro Mitin
schedule
13.11.2020
ap
напрямую. Скорее, я использовал его неявно, используя такие вещи, какtupled
,mapN
иtraverse
. - person Luis Miguel Mejía Suárez   schedule 13.11.2020apN
какmapN
, но я думаю, что ответ тот же. - person gervais.b   schedule 13.11.2020Apply
- это специализированный класс типаApplicative
, который также является функтором. Applicative обеспечиваетap
работу. Она очень похожа на карту Functor, но функция в аргументе уже находится вF[_]
домене. Во многих случаях, таких как моноиды, они могут использоваться взаимозаменяемо, за некоторыми исключениями. - person texasbruce   schedule 13.11.2020ap
чаще используется композиция сmap
формыap(map)
, более известная какliftA2
. Обратите внимание, чтоap
- очень фундаментальная операция, и вы должны знать, когда использовать ее вместоflatMap
. - person Iven Marquardt   schedule 13.11.2020