[英]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 通過以下邏輯標識塊中每個條目的開始:
這個邏輯始終適用於 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.