Могу ли я отобразить первый элемент пары без стрелок?

Я присматриваюсь к функторам, аппликативным функторам... Я не знаю, как добиться того, чего хочу, но у меня такое ощущение, что следование типам должно привести к мне ближе.

Существует ли простой способ сделать карту-подобной, которая применяется только к первому элементу двойки? Взяв firstиз Control.Arrowи используя Arrow (->), это прекрасно справляется с задачей:

map . first :: (b -> c) -> [(b, d)] -> [(c, d)]

Меня беспокоит только то, что мне еще предстоит получить настоящую интуицию для стрел, и поэтому я, вероятно, рано или поздно окажусь в глубокой воде, если буду продолжать в том же духе. Кроме того, это, кажется, довольно удобный случай, который нельзя обобщать.

Могу ли я получить ту же функциональность, используя что-то из функторов, монад или чего-то еще, и в то же время добраться до сути того, что я хочу? Я играл с

\f -> map (f `on` fst)

-подобными идеями, но не мог дойти до конца.

6
задан Ashe 30 May 2012 в 14:52
поделиться