部分应用于特定的参数槽

时间:2018-10-18 09:43:50

标签: haskell pointfree partial-application

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

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

3 个答案:

答案 0 :(得分:2)

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

\x -> method x par2

它产生

flip method par2

\x y z -> f x y z value

它产生

flip flip value . (flip .) . f

虽然我认为可读性有所不同。

答案 1 :(得分:2)

我通常会避免使用flip,但是通过将其视为中缀运算符并对其进行分段,可以很容易地为命名函数提供仅提供第二个参数

    (`filterText` "astr")

同样,该函数中的lambda可以减小为

      (not . (`elem` chars))

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

但是通常当您遇到这种情况时,就值得考虑是否应该首先使用翻转参数来更好地定义函数。

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

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

答案 2 :(得分:1)

您可以为此使用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)