函数缩进语法的Haskell扩展

时间:2014-06-18 08:55:52

标签: haskell syntax

为模糊的问题标题道歉;我找不到合适的人。

几年前,我遇到了一个语言扩展提案的页面(我猜是在Haskell Prime wiki上)。假设一个Haskell代码如:

f1 (f2 v1 v2 v3) (f3 v4 v5 v6)

并且假设f2 v1 ...部分具有较长的函数名称和值名称,使整行比期望的更长并且更难阅读。我们想把它改成

f1
    (f2 v1 v2 v3)
    (f3 v4 v5 v6)

更具可读性,可以更清晰地表示结构,即什么是什么的论据。但是,如果我们有一个更复杂的关系,如

f1
    (f2 (f3 v1) (f4 v2) v3)
    (f5 v4)
    (f7 v5)

然后它会很快变得凌乱而且括号失去控制。

理想情况下我们可以

f1
    f2
        f3 v1
        f4 v2
        v3
    f5 v4
    f7 v5

因此人体和机器的结构都很清晰。但是由于Haskell标准是不可能的,所以一群聪明的家伙提出了语言扩展的想法,允许一个新的运营商。运算符看起来像$但具有不同的关联性。我们说它叫$$,然后是:

f1 $$
    f2 v1 v2 v3
    f3 v4 v5 v6

等同于f1 (f2 v1 v2 v3) (f3 v4 v5 v6)

f1 $$
    f2 $$
        f3 v1
        f4 v2
        v3
    f5 v4
    f7 v5

会转换为f1 (f2 (f3 v1) (f4 v2) v3) (f5 v4) (f7 v5)

我喜欢使用GHC扩展来实现此功能,因为实现具有树状结构的DSL会轻而易举,但我找不到任何资源。

  1. 这个概念(以及我称之为$$的运算符)的名称是什么?
  2. 这是否已经有GHC扩展?
    • 如果没有,我真的很感谢任何其他相关扩展的链接。我愿意学习如何编写GHC扩展来实现它。
  3. 编辑:我知道有很多变通办法,包括模板Haskell QQ和括号,但我记得看过一个语言扩展提案,我的问题是关于该扩展,而不是其他解决方法问题

    顺便说一句,我觉得非常不愿意将括号视为一个选项,因为括起一个复杂的嵌套结构将使它看起来非常混乱并且打败了基于缩进的代码布局的整个点。如果您必须对几乎所有内容进行括号并手动设置其外观以构造结构,那么“off-side rule”语法优于“花括号”语法的好处会受到影响。我很确定有很多Haskeller认为它是不洁净的,正如在基于monoid的库中观察到的那样,monad(并且传递一个空值)可以利用do语法。虽然他们可以写

    example = mappend
        [ lorem ipsum
        , dolor amet
        ]
    

    他们更喜欢声明monad实例并编写

    example = do
        lorem ipsum
        dolor amet
    

    不是因为它在类型方面更有意义,而是因为它看起来干净简洁。 (实际上括号中的问题比使用括号更严重,因为你需要插入几乎两倍的特殊字符来表示函数应用程序的结构。)这也会大大减少错误丢失符号的几率,这正是优势大括号语言的偏离规则语言。在最好的情况下,丢失或错放括号,括号或逗号将导致编译时错误,最糟糕的是,这是一个错误的程序,它会做出一些疯狂和无意的事情。

2 个答案:

答案 0 :(得分:2)

我终于找到了这个页面,所以我会回答我自己的问题。

它被称为Application Layout。它是在monoid布局之后提出的,它建议使用新的关键字be(或mdo)来消除无意义的monad实例获取do符号的需要。

答案 1 :(得分:1)

如果您想在GHC Haskell中嵌入自定义语法,可以试试Quasiquoters

从链接的示例中无耻地复制,quasiquoting可以转换语法,如

[expr|1 + 3|]

BinopExpr AddOp (IntExpr 1) (IntExpr 3)

,其中

data Expr  =  IntExpr Integer
           |  AntiIntExpr String
           |  BinopExpr BinOp Expr Expr
           |  AntiExpr String
data BinOp  =  AddOp |  SubOp |  MulOp |  DivOp

你需要构建自己的解析器来转换字符串,例如" 1 + 3"进入实际的术语表示。在您的情况下,您需要自己处理缩进。

相关问题