簡體   English   中英

我保留錯誤“解析輸入 ins 時出錯”

[英]I keeping the error "error on parsing on input ins"

module HW2sol 
where import HW2types

ins :: Eq a => a -> Bag a -> Bag a
ins x [] = [(x,1)]
ins x (y:ys) =
    if x == fst y
        then (x, snd y + 1) : ys
        else y : (ins x ys)

此代碼中的 HMW2types 只是一個包含包類型的所有聲明的文件。 我什至從網上復制並粘貼了其他功能,但他們得到了同樣的錯誤。 這個 function 獲取一個元素並將其添加到包中。

[2 of 2] 編譯 HW2sol ( HMW2sol.hs, HMW2sol.o )

HMW2sol.hs:5:1:輸入“ins”時出現解析錯誤

您可能知道 Haskell 的縮進規則。 任何地方你有一個聲明塊(如let <decls> in <expr>where等)或語句塊(如do塊中),或模式和分支塊(如case表達式)Haskell 通過以下邏輯標識塊中每個條目的開始:

  1. 標識塊中第一個條目的第一個字符的列。 將此列稱為 C
  2. 縮進小於C的下一行表示塊的結尾(並且不是塊的一部分)。
  3. 在塊結束之前,任何精確縮進C 個字符的行都會在塊中開始一個新條目。
  4. 在塊結束之前,任何縮進超過C的行都是前一個條目的續行

這個邏輯始終適用於 Haskell 的所有“塊”結構。 它們都必須以這種方式對齊1 事實證明,模塊中的頂級聲明形成了一個對齊的塊 我們只是通常不會費心去想它們,因為它們通常從第 1 列開始(這意味着不可能結束塊,因為在第一列之前沒有行可以開始。人們通常只是把他們所有的頂部-level 聲明在行的開頭並縮進任何延續而無需考慮“對齊模塊的主塊”)。

但是,您的代碼沒有(成功地)使用這種傳統布局。 因為您沒有在where之后插入換行符,所以第一個聲明從第 7 列開始,而不是第 1 列!

where import HW2types
      ^
1234567

您的ins類型聲明從第 1 列開始,因此根據上面的規則 2(1 小於 7),這表示模塊定義塊的結尾; 編譯器必須將ins:: Eq a =>...解析為可以在模塊中的主塊之后的東西,而不是將其解析為主塊的聲明。 這就是為什么你會得到一個解析錯誤(沒有任何東西可以跟隨主塊)。

如果您在第 7 列開始模塊的主塊,那么您的所有聲明都必須縮進到第 7 列。這實際上有效:

module HW2sol 
where import HW2types

      ins :: Eq a => a -> Bag a -> Bag a
      ins x [] = [(x,1)]
      ins x (y:ys) =
          if x == fst y
              then (x, snd y + 1) : ys
              else y : (ins x ys)

但是,您可能會發現在where之后簡單地換行並在新行上import HW2types會容易得多。


1或者,塊及其條目可以用大括號和分號顯式分隔。 但這在 Haskell 中不是通常的風格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM