假设我有以下代码
module A where
x :: Int
x = 5
module Main where
import A
import Lib
main :: IO ()
main = print (x + y)
以及外部库中
module Lib where
y :: Int
y = 10
一切都很好,该库的版本为 v0.1.0.0,我将其包含在边界中
mylib == 0.1.*
现在,名称
x :: Int
已添加到MyLib的导出列表中,并且新版本已发布。它的版本是v0.1.1.0,如PVP流程图中建议:
在这种情况下,只有[...]函数[...]被添加到库的导出接口中。不会导致破损
这个说法如何正确?当然我的代码不再编译。因为它不知道从哪里拉
x
。
我们建议重点关注以下两种形式的进口:
Another.Important.Module (printf, (<|>), )
而不是
hiding (open, close, )
造成这种情况有四种不同的原因。
[..]
兼容性:在第二种情况下,如果将新标识符添加到导入的模块中,它们可能会与其他模块的名称冲突。因此,更新导入的模块可能会破坏您的代码。如果导入版本为 a.b.c.d 且遵循包版本控制策略的包 A,则在具有相同 a.b 的版本中允许添加标识符。这意味着如果您导入建议的方式,您可以安全地在 Cabal 文件中指定
。否则你必须选择较小的范围A >= a.b.c && <a.b+1
。也可能是当您隐藏A >= a.b.c && <a.b.c+1
时,它已被弃用,并且通过模块更新删除该标识符,您的导入会失败。也就是说,一个你从来不需要的标识符,只会让你烦恼,当它本来不会再打扰你的时候,它会再次让你烦恼!第一个导入变体不会遇到这些问题。Another.Important.Module.open