【问题标题】:Is it possible to use a bracketing syntactic sugar for an applicative functor?是否可以为应用函子使用括号语法糖?
【发布时间】:2012-08-17 23:50:05
【问题描述】:

McBride and Paterson's 'Applicative programming with effects' 中,他们介绍了一些可爱的语法糖来提升纯函数:

[| f x y z |]

f <$> x <*> y <*> z

我记得有人在其他地方使用 li f w x y z ilil f v w x y z li,我认为/希望这可能是因为它可以使用一些现有的语言功能和 liil 的巧妙定义来定义。

我在论文之外找不到任何参考,假设[||] 不太可能很快出现在ghc 中,是否可以实现li 和@987654333 @ 不知何故?我想不出适合他们的类型,所以我认为我需要 Template Haskell 或类似的东西,但我知道的还不够多。 [af| f x y ] 可以,但在我开始尝试之前我不知道这是否可行,如果可以,当然需要帮助。

【问题讨论】:

  • 我确信she 可以做到。
  • 你可能想看看Template Haskell
  • 我发现我使用它的次数比我想象的要少:我可能会过度使用$,而&lt;*&gt; 是一种非常方便的分配函数参数的方法:我发现我无论如何,通常最终都会写glab &lt;$&gt; getsome values fromthis &lt;*&gt; getmore values fromthat。我仍然非常喜欢所有应用性的东西;我错误地认为语法妨碍了我。

标签: haskell syntactic-sugar template-haskell applicative


【解决方案1】:

我认为this 是您正在寻找的。如果我没记错的话,haskell-cafe 邮件列表上也有关于这种应用程序风格的讨论。

【讨论】:

    【解决方案2】:

    通过使用 haskell-src-meta 包解析准引用中的 Haskell 表达式,这很容易在 Template Haskell 中实现。

    {-# LANGUAGE TemplateHaskell #-}
    
    import Language.Haskell.TH
    import Language.Haskell.TH.Quote
    import Language.Haskell.Meta (parseExp)
    
    import Control.Applicative ((<*>), (<$>))
    
    af = QuasiQuoter
        { quoteExp  = parseAf
        , quotePat  = undefined
        , quoteType = undefined
        , quoteDec  = undefined
        }
    
    parseAf :: String -> Q Exp
    parseAf s = case parseExp s of
        Right ex -> applyExp ex
        Left err -> fail err
    
    applyExp :: Exp -> Q Exp
    applyExp (AppE f@(AppE _ _) a) = [|$(applyExp f) <*> $(return a)|]
    applyExp (AppE f a) = [|$(return f) <$> $(return a)|]
    applyExp _ = fail "invalid expression in af"
    

    请注意,由于 Template Haskell 的工作原理,您不能在定义它的同一文件中使用准引用器,因此请将上述内容保存到其自己的模块中。

    在 GHCi 中测试

    *Main> :set -XTemplateHaskell
    *Main> :set -XQuasiQuotes
    *Main> [af|(+) (Just 3) (Just 8)|]
    Just 11
    *Main> [af|(+) (Just 6) Nothing|]
    Nothing
    

    【讨论】:

    • 这真的很可爱,是的。这是两者中我最喜欢的表示法,部分原因是它更清楚语法中发生了什么,部分原因是它通过脱糖来做语法糖,感觉更像是正确的做法。 Applicative 很棒,这使得语法和概念一样好。谢谢。我现在要重构一个项目以使用应用程序。嗯嗯嗯嗯。
    【解决方案3】:

    模板 Haskell 方法是由 Matt Morrow 编写的,然后由我在applicative-quoters package 中维护。您将其用作[i| f x y z |],因此它与 McBride 和 Paterson 最初的想法相当接近。

    (可能的缺点:名称i 不应被您的代码所遮蔽,否则它将无法正常工作。个人不确定这有多大意义)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2023-04-09
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多