您好,我想知道是否可以在特定位置向方法提供参数以进一步使用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
,并以某种方式绑定第二个参数而不是第一个参数。
答案 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)