在麦克布莱德和帕特森的“带效果应用型节目” ,他们推出一种用于提升纯函数的一些可爱的语法糖:
[| f x y z |]
对于
f <$> x <*> y <*> z
我记得有人在其他地方使用li fwxyz il
或il fvwxyz li
,我想/希望,也许是因为它可以使用一些现有的语言功能和狡猾的定义来定义li
和il
。
我无法找到超越纸本的任何参考,并假设[|
和|]
不太可能在GHC任何时间很快转起来,是有可能实现li
和il
不知何故? 我想不出一个合理的类型当中,所以我想我需要模板哈斯克尔或类似的,但不知道远不足以实现这一目标。 [af| fxy ]
[af| fxy ]
将被罚款,但我不知道是否有可能开始之前,我尝试它,肯定需要帮助,如果它是。
这是很容易使用的模板哈斯克尔实现哈斯克尔-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
我想, 这是你在找什么。 如果我没有记错同时也出现了关于应用性应用中,这种风格的Haskell咖啡厅的邮件列表上的讨论。
模板哈斯克尔的办法处理这一被写了马特·莫罗,然后保持由我,在应用性,quoters包 。 您可以使用它作为[i| fxyz |]
[i| fxyz |]
所以这是相当接近的麦克布赖德和帕特森的本意。
(可能的缺点:名字i
不应该由你的代码被隐藏,否则它将无法工作不知道交易有多大,这是,个人)。
文章来源: Is it possible to use a bracketing syntactic sugar for an applicative functor?