为什么 Haskell PVP 将新函数描述为非破坏性?

问题描述 投票:0回答:1

假设我有以下代码

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

haskell versioning compatibility
1个回答
0
投票

Haskell wiki 有一篇关于此的文章

我们建议重点关注以下两种形式的进口:

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
时,它已被弃用,并且通过模块更新删除该标识符,您的导入会失败。也就是说,一个你从来不需要的标识符,只会让你烦恼,当它本来不会再打扰你的时候,它会再次让你烦恼!第一个导入变体不会遇到这些问题。

© www.soinside.com 2019 - 2024. All rights reserved.