繁体   English   中英

函数缩进语法的Haskell扩展

[英]Haskell extension for function indentation 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扩展来实现此目的。

编辑 :我知道有很多解决方法,包括模板Haskell QQ和括号,但是我记得看到一个语言扩展建议,而我的问题是关于该扩展的,而不是其他解决问题的方法。

顺便说一句,我感到非常不愿意考虑使用括号,因为将复杂的嵌套结构括起来会使其看起来非常混乱,并打败了基于缩进的代码布局的重点。 如果您必须对所有内容都加上括号并对其进行手动样式设置以使其看起来结构化,那么“越界规则”语法相对于“花括号”语法的好处就会受到损害。 我很确定有很多Haskellers认为它是不干净的,正如在基于Monoid的库中观察到的那样,该库具有毫无意义的monad实例(以及要传递的空值)来利用do语法。 虽然他们可以写

example = mappend
    [ lorem ipsum
    , dolor amet
    ]

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

example = do
    lorem ipsum
    dolor amet

不是因为它在类型上更有意义,而是因为它看起来干净简洁。 (实际上,括号引起的问题比括号引起的问题更严重,因为您需要插入几乎两倍的特殊字符来表示函数应用程序的结构。)这也将大大减少错误地丢失符号的机会,这正是优点大括号语言之外的越位规则语言。 在最佳情况下,括号,方括号或逗号的丢失或放错位置会导致编译时错误,甚至更糟,这是一个有错误的程序,执行了某些野蛮的意外操作。

我终于设法找到了该页面,所以我将回答我自己的问题。

这就是所谓的应用程序布局 它是在monoid布局之后提出的,它建议使用一个新关键字be (或mdo ),该关键字将消除无意义的monad实例获取do表示法的需求。

如果要在GHC Haskell中嵌入自定义语法,则可以尝试Quasiquoters

从链接的示例中毫不客气地复制,准引用可以使语法像

[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”的字符串转换为实际的术语表示形式。 对于您的情况,您将需要自己处理缩进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM