Частичное применение к определенному параметру - PullRequest
0 голосов
/ 18 октября 2018

Здравствуйте, я хочу знать, возможно ли предоставить параметр для метода в определенной позиции для дальнейшего использования point-free-notation:

 readData::Text->[Int]
    readData =catMaybes . maybeValues where
        maybeValues=mvalues.split.filterText

 filterText::Text->[Char]->Text
    filterText tx chars=Data.Text.filter (\x -> not (x `elem` chars)) tx

Как я могу предоставить filterText только 2 -ой параметр?например:

filterText "astr", где astr - аргумент [Char] (вторая позиция).
Вообще говоря, имея метод mymethod par1 par2 par3, могу ли я его использовать:
mymethod par2и как-то связать второй аргумент, а не первый.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Для этого можно использовать flip :: (a -> b -> c) -> b -> a -> c: с помощью flip вы берете функцию и, таким образом, «переворачиваете» параметры.Затем вы можете частично применить один параметр: второй.

Таким образом, в этом конкретном случае вы можете использовать:

foo :: Text -> Text
foo = flip filterText "astr"

Вы также можете улучшить filterText:

filterText::Text -> [Char] -> Text
filterText tx chars = Data.Text.filter (`notElem` chars) tx

или даже:

filterText::Text -> [Char] -> Text
filterText = flip (Data.Text.filter . flip notElem)
0 голосов
/ 18 октября 2018

Как правило, я бы избегал flip, однако , предоставив только второй аргумент , для именованной функции можно легко сделать, обработав ее как инфиксный оператор и разделив ее на:

    (`filterText` "astr")

Аналогично, лямбда в этой функции может быть уменьшена до

      (not . (`elem` chars))

(или далее до (`notElem` chars)).

Но часто, когда вы попадаете в такую ​​ситуацию, этоСтоит подумать, лучше ли в первую очередь определить функцию с перевернутыми параметрами.

filterText :: [Char] -> Text -> Text
filterText chars = Data.Text.filter (`notElem` chars)

Обратите внимание, что я мог бы η-уменьшить параметр tx бесплатно, и теперь вы можете просто написать filterText "astr".

0 голосов
/ 18 октября 2018

pointfree.io поможет во всем этом, например, при запросе

\x -> method x par2

он дает

flip method par2

и

\x y z -> f x y z value

это дает

flip flip value . (flip .) . f

читаемость - это нечто другое, хотя, на мой взгляд.

...