Принятый ответ совершенно прав. Возможно, я бы хотел использовать аппликативный оператор;
strippedInput = T.filter $ (||) <$> C.isMark <*> C.isAlpha
Однако проблема с liftA2
заключается в том, что, как видно из названия, она связана только с двумя функциями параметров, и да, это нормально дляэтот вопрос. Тем не менее ... Haskell предоставляет более разумную общую абстракцию для этой работы. В основном это называется монада функций, которая в основном обобщается как монада Reader, добавляя некоторые вспомогательные функции и возможности преобразователя. Однако для простоты мы можем попробовать здесь монаду функции.
Монада Function / Reader используется для объединения не только двух, но и неопределенного числа функций (каждая принимает два параметра), и в этом случае первый параметр подаетсяпредыдущий результат функции, а второй - общее состояние только для чтения (в данном случае это input
)
Таким образом, ответ на этот вопрос также может быть следующим:
strippedInput = T.filter (C.isMark >>= (\b c -> b || C.isAlpha c) >>= return)
Однако, посколькупакет Data.Char
полон проверок типа isThis
, isThat
, мы можем показать, как можно расширить этот подход.
strippedInput = T.filter (C.isMark >>= (\b c -> b || C.isAlpha c)
>>= (\b c -> b || C.isSymbol c)
.
.
>>= return)
и ... никто не мешает вам сделать функцию сравнения, такую как
orWith f = \b c -> b || f c
strippedInput = T.filter $ C.isMark >>= orWith C.isAlpha
>>= orWith C.isSymbol
.
.
>>= return