簡體   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