最佳答案
在调试程序中的一个问题时(使用 Gloss*
将两个半径相等的圆绘制成不同大小) ,我偶然发现了一个奇怪的情况。在处理对象的文件中,Player
的定义如下:
type Coord = (Float,Float)
data Obj = Player { oPos :: Coord, oDims :: Coord }
在导入 Objects.hs 的主文件中,我有以下定义:
startPlayer :: Obj
startPlayer = Player (0,0) 10
这是因为我添加和更改了播放器的字段,忘记了更新 startPlayer
(它的尺寸由一个数字来表示半径,但是我把它改为 Coord
来表示(宽度,高度) ; 以防我把播放器对象变成非圆形)。
令人惊奇的是,上面的代码编译并运行,尽管第二个字段的类型不对。
我最初以为可能打开了不同版本的文件,但是对任何文件的任何更改都反映在编译后的程序中。
接下来我想也许 startPlayer
因为某种原因没有被使用。注释掉 startPlayer
会导致编译器错误,更奇怪的是,在 startPlayer
中更改 10
会导致适当的响应(更改 Player
的起始大小) ; 同样,尽管它的类型不对。为了确保它正确地读取数据定义,我在文件中插入了一个输入错误,它给了我一个错误; 因此我正在查看正确的文件。
我尝试将上面的2个代码片段粘贴到它们自己的文件中,结果出现了预期的错误,即 startPlayer
中 Player
的第二个字段是不正确的。
怎么可能会发生这种事?你可能会认为这正是 Haskell 的类型检查器应该防止的事情。
我最初的问题的答案是,两个半径相等的圆被画到不同的大小,其中一个半径实际上是负的。