Можно ли сделать функции с плавающей точкой более читаемыми с использованием разных комбинаторов, чем (.)?

Каковы потенциальные альтернативные представления (например, использование стрелок, линз, иконок Haskell, синтаксис) точечных выражений, которые могли бы больше походить на простой английский?

Вот тривиальный пример:

qNameIs :: String -> QName -> Bool
qNameIs = (. qName) . (==)

QName - это запись из Text.Xml

Что может быть эквивалентно qNameIs, но не точечным выражениям? В идеале те, которые показывают, что первый аргумент будет передан в (==), и результат будет оценен с результатом QName, примененным ко второму аргументу этого выражения?

Ответ 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 (к сожалению, это не помогает в вашем случае...).