编译Haskell代码时出现类型变量未作用域等错误的原因
Haskell代码编译错误原因解析
先把你的代码贴出来方便对照:
main :: IO() main = do print (isBalanced (Node 17 (Node 14 Empty Empty) (Node 20 (Node 20 Empty Empty) (Node 20 Empty Empty))) 2) data Tree a = Empty | Node а (Tree a) (Tree a) deriving (Read, Show) depth :: Tree a -> Int depth Empty = 0 depth (Node _ t1 t2) = 1 + max (depth t1) (depth t2) isBalanced :: Tree a -> Int -> Bool isBalanced Empty _ = True isBalanced (Node n t1 t2) k = abs (depth t1 - depth t2) <= k && isBalanced t1 k && isBalanced t2 k
接下来逐个分析你遇到的两类错误:
1. "type variable not in scope" 错误
这个问题出在你定义Tree代数数据类型的那一行:
data Tree a = Empty | Node а (Tree a) (Tree a) deriving (Read, Show)
注意看Node后面的那个字母——它不是英文的小写字母a,而是俄文的小写字母а(西里尔字母)。Haskell会把这个陌生的字符当成一个未声明的类型变量,而你的代码里根本没有定义过这个类型变量,所以编译器就抛出了“类型变量不在作用域内”的错误。
你只需要把这个俄文的а替换成英文的a,这部分错误就会消失。
2. ": commitBuffer: invalid argument (invalid character)" 错误
这个奇怪的错误同样是由上面提到的**非ASCII字符(俄文а)**导致的。Haskell编译器在处理代码时,遇到了它无法识别的非标准ASCII字符,进而引发了输出缓冲区的写入错误。本质上还是那个错误的字符在捣乱,只要把它换成英文的a,这个错误也会跟着解决。
总结一下,所有问题的根源都是代码里混入了一个俄文的西里尔字母,替换成对应的英文字母就能解决所有编译错误啦。
内容的提问来源于stack exchange,提问作者S. Werner
相关产品推荐
相关产品推荐

