Ответ 1
Вы можете взять . ^ оператора Data.Function.Pointless:
import Data.Function.Pointless (.^)
qNameIs :: String -> QName -> Bool
qNameIs = (==) .^ qName
Пример со стрелками (его не элегантный...):
qNameIs :: String -> QName -> Bool
qNameIs = curry $ uncurry (==) . second qName
Вы также можете написать новый оператор:
with :: (a -> c -> d) -> (b -> c) -> a -> b -> d
with f g = (. g) . f
Затем вы можете написать:
qNameIs = (==) `with` qName
который можно считать "равным с qName" (вы также можете взять другое имя оператора).
В целом вы также должны взглянуть на модуль Data.Composition (к сожалению, это не помогает в вашем случае...).