[英]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.