Перевернутый / перевернутый fmap (‹$›)?

Я нашел определение следующего

(%)  = flip fmap

Я могу написать такой код:

readFile "/etc/passwd" % lines % filter (not . null)

Для меня это имеет больше смысла, чем альтернатива:

filter (not . null) <$> lines <$> readFile "/etc/passwd"

Очевидно, это просто вопрос порядка.

Кто-нибудь еще делает это? Есть ли веская причина не писать такой код?


person James    schedule 05.11.2009    source источник
comment
Более распространенное название для этого, вероятно, <&> следует за (&) = flip ($) объективом.   -  person fread2281    schedule 31.08.2014


Ответы (5)


Ваш оператор (%) в точности является оператором (<&>) из пакета линз.

Его можно импортировать с помощью:

import Control.Lens.Operators ((<&>))
person Community    schedule 01.07.2016

(<&>) :: Functor f => f a -> (a -> b) -> f b 

Теперь доступно с Data.Functor в base.

https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor.html#v:-60--38--62-

person Chris Stryczynski    schedule 07.12.2019
comment
Начиная с base версии 4.11.0.0 - person MikaelF; 11.01.2020

Существует аналогичная функция для класса типа Applicative, которая называется <**>; вполне разумно хотеть или использовать и для Functor. К сожалению, семантика <**> немного отличается, поэтому ее нельзя напрямую расширить для применения к Functor.

person bdonlan    schedule 05.11.2009

-- (.) is to (<$>) as flip (.) is to your (%).  

Я обычно определяю (&) = flip (.), и, как и в вашем примере, вы можете применять обратные слова для композиции функций. На мой взгляд, упрощает понимание кода без точек.

person codebliss    schedule 05.11.2009
comment
Также есть комбинатор со стрелками (›››), который аналогичен (flip (.)) для функций - person Will; 06.11.2009
comment
Почему спасибо, сэр! Помимо стандартного импорта, это будет полезно, чтобы я мог сохранить стандартный код. - person codebliss; 07.11.2009
comment
Обратите внимание, что объектив определяет (&) = flip ($) - person fread2281; 31.08.2014

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

person Martijn    schedule 05.11.2009
comment
Не уверен, что нахожу этот аргумент достаточно убедительным, но это интересная точка зрения, так что +1. Из любопытства: вы предпочитаете =<< >>= по той же причине? - person Stephan202; 05.11.2009
comment
Никогда не понимал предыдущее утверждение. Кажется, имеет смысл использовать стандартную нотацию, потому что тогда это похоже на конвейер Unix? - person codebliss; 05.11.2009
comment
Я предпочитаю =‹‹ ››=, потому что форма имеет четкую интерпретацию в терминах категории Клейсли вашей монады, которую можно инвертировать, чтобы дать понятное определение комонадам. - person Edward KMETT; 05.11.2009
comment
Стефан: что сказал ваш аргумент, кажется, я изложил. Предпочтение ››= вместо =‹‹ было бы более подходящим, поскольку вам дано первое, а другое является производным. Я понимаю, что вы были после порядка аргументов, хотя. - person Edward KMETT; 05.11.2009
comment
Я не согласен. Кто-то уже должен перевернуть поток повествования в глубоких функциональных композициях (особенно в бесточечном стиле), чтобы иметь возможность истолковать поток данных кода. В то же время >>= приводит к потоку кода, который соответствует потоку данных. Вместе они могут легко привести к таким строкам кода: action1 >>= action3 . action2 >>= action4, где читатель должен изменить порядок чтения несколько раз в строке, чтобы иметь возможность понять конвейер потока данных. В этом случае будет полезна композиция перевернутой функции. - person ulidtko; 24.12.2014