部分应用于特定参数槽

Partial application to a specific parameter slot

你好我想知道是否可以在特定位置为方法提供参数以供进一步使用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-nd 参数?像这样:

filterText "astr" 其中 astr[Char] 参数(第二个位置)。
一般来说,如果有方法 mymethod par1 par2 par3 我可以使用它:
mymethod par2 并以某种方式绑定第二个参数而不是第一个参数。

pointfree.io 将帮助解决所有这些问题,例如,当 要求

\x -> method x par2

它产生

flip method par2

\x y z -> f x y z value

它产生

flip flip value . (flip .) . f

虽然在我看来可读性有所不同。

您可以为此使用 flip :: (a -> b -> c) -> b -> a -> c:使用 flip 可以获取函数,因此可以使用 "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)

我会避免 flip 作为一般规则,但是 仅提供第二个参数 可以通过将其视为中缀运算符来轻松完成命名函数,并且分段:

    (`filterText` "astr")

同样,该函数中的 lambda 可以简化为

      (not . (`elem` chars))

(或更进一步 (`notElem` chars))。

但通常当您发现自己处于这种情况时,值得考虑是否应该首先使用翻转参数定义函数。

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

请注意,我可以免费减少 tx 参数,现在您可以只写 filterText "astr".