是否有可能使用括号语法糖的适用函子?(Is it possible to use a bracket

2019-07-31 01:37发布

在麦克布莱德和帕特森的“带效果应用型节目” ,他们推出一种用于提升纯函数的一些可爱的语法糖:

[| f x y z |]

对于

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

我记得有人在其他地方使用li fwxyz ilil fvwxyz li ,我想/希望,也许是因为它可以使用一些现有的语言功能和狡猾的定义来定义liil

我无法找到超越纸本的任何参考,并假设[||]不太可能在GHC任何时间很快转起来,是有可能实现liil不知何故? 我想不出一个合理的类型当中,所以我想我需要模板哈斯克尔或类似的,但不知道远不足以实现这一目标。 [af| fxy ] [af| fxy ]将被罚款,但我不知道是否有可能开始之前,我尝试它,肯定需要帮助,如果它是。

Answer 1:

这是很容易使用的模板哈斯克尔实现哈斯克尔-SRC-元包解析在准报价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"

需要注意的是,由于模板哈斯克尔是如何工作的,你不能使用quasiquoter从那里它被定义相同的文件,所以上面保存到其自己的模块。

在GHCI测试

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


Answer 2:

我想, 这是你在找什么。 如果我没有记错同时也出现了关于应用性应用中,这种风格的Haskell咖啡厅的邮件列表上的讨论。



Answer 3:

模板哈斯克尔的办法处理这一被写了马特·莫罗,然后保持由我,在应用性,quoters包 。 您可以使用它作为[i| fxyz |] [i| fxyz |]所以这是相当接近的麦克布赖德和帕特森的本意。

(可能的缺点:名字i不应该由你的代码被隐藏,否则它将无法工作不知道交易有多大,这是,个人)。



文章来源: Is it possible to use a bracketing syntactic sugar for an applicative functor?