Haskell 未引用的构造函数可能会导致什么样的问题?

Haskell 未引用的构造函数可能会导致什么样的问题?,haskell,ghc,compiler-warnings,data-kinds,Haskell,Ghc,Compiler Warnings,Data Kinds,我正在使用GHC扩展名-XDataKinds,并在我正在编写的Haskell库中打开了-Wall。我收到一条关于使用未经检查的提升构造函数的警告,因为-Wall意味着。我想知道为什么这个警告很重要;如果允许我用默认语法以未勾选的样式编写,有什么害处 我编写的大多数依赖类型的代码都在Idris中(还有一部分在Agda中),因此我习惯于使用类型和值的统一名称空间。因此,我觉得用不加标记的文体写作很自然。但是,如果有潜在的危害,我会添加蜱。但我不想在不了解原因的情况下这样做 例如,如果我有这样的数据类

我正在使用GHC扩展名
-XDataKinds
,并在我正在编写的Haskell库中打开了
-Wall
。我收到一条关于使用未经检查的提升构造函数的警告,因为
-Wall
意味着。我想知道为什么这个警告很重要;如果允许我用默认语法以未勾选的样式编写,有什么害处

我编写的大多数依赖类型的代码都在Idris中(还有一部分在Agda中),因此我习惯于使用类型和值的统一名称空间。因此,我觉得用不加标记的文体写作很自然。但是,如果有潜在的危害,我会添加蜱。但我不想在不了解原因的情况下这样做

例如,如果我有这样的数据类型:

data HasDefault = IsDefaulted | NotDefaulted
setDefault :: a -> T p NotDefaulted a -> T p IsDefaulted a
在函数签名中使用的,如下所示:

data HasDefault = IsDefaulted | NotDefaulted
setDefault :: a -> T p NotDefaulted a -> T p IsDefaulted a
然后我得到这样的警告(同时设置了
-Werror
):


我是否应该担心这一点,并确保对滴答作响的施工人员勤奋?还是应该关闭警告?

“为了方便起见,GHC允许您在名称明确时省略引号。但是,我们的经验表明,引号有助于使代码更可读,更不容易出错。”@melpomene感谢您指出这一点。我很想听到更多关于“可读性更强、更不容易出错”的细节(这里的可读性是一个背景问题吗?哈斯凯勒更容易阅读,但伊德里斯人可能不会更容易阅读,等等?会发生什么样的错误?等等)是的。不幸的是,这是我在手册中所能找到的全部。给定
数据代理(t::k)
新类型标识a=Identity a
代理标识
代理标识
不是同一类型。我发现统一使用
,即使是在明确无误的情况下,也会使我更容易读取数据类型。我想这也是因为
数据T=T
在Haskell是合法的,不像Agda。因此,当
F
是多类的并且可以同时接受
T:*
'T::T
时,我们需要消除
F T
F'T
之间的歧义。