【问题标题】:Partial application to a specific parameter slot对特定参数槽的部分应用
【发布时间】:2018-10-18 09:43:50
【问题描述】:

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

【问题讨论】:

  • 定义filterText :: [Char] -> Text -> Text,问题解决。出于同样的原因,filter 将谓词而不是要过滤的列表作为其第一个参数。过滤条件与过滤过程的关系比被过滤的东西更紧密,所以它是函数的 参数。
  • 换句话说,条件定义了过滤器:给定[Char],你会得到一个Text -> Text类型的函数来过滤它的输入。

标签: haskell pointfree partial-application


【解决方案1】:

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

    (`filterText` "astr")

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

      (not . (`elem` chars))

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

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

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

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

【讨论】:

    【解决方案2】:

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

    \x -> method x par2
    

    它产生

    flip method par2
    

    为了

    \x y z -> f x y z value
    

    它产生

    flip flip value . (flip .) . f
    

    在我看来,可读性是不同的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您的回答,确实解决了我当前的问题,但是,我问的是更广泛的术语。在当前情况下,我想部分应用的参数是第二个..但是给1...N 参数,你想在1 to N 的参数位置的任何地方部分应用P 参数,你可以这样做吗?
      • @BercoviciAdrian:你写了一个 lambda 表达式,比如\foo bar -> someFunc foo bar "data"
      猜你喜欢
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多