似乎模板Haskell经常被Haskell社区视为一种不幸的便利.我很难准确地说出我在这方面所观察到的内容,但请考虑这几个例子
我已经看过各种博客文章,其中人们使用模板Haskell做了相当简洁的东西,实现了更好的语法,这在常规的Haskell中是不可能的,以及巨大的样板减少.那么为什么模板Haskell以这种方式受到鄙视呢?是什么让它不受欢迎?在什么情况下应避免模板Haskell,为什么?
在我学习Haskell时,我发现在现实代码中使用了很多语言扩展.作为初学者,我应该学会使用它们,还是应该不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性,并且仅将代码限制为几乎GHC.但是,如果我在Hackage上浏览软件包,我发现大多数软件包都是GHC的.
那么,社区对使用语言扩展的态度是什么?
如果扩展的使用是可以的,我如何区分我可以"安全地"使用的扩展(那些可能成为下一个Haskell标准的一部分的扩展)与那些主要是"实验性"的扩展?例如,我认为-XDisambiguateRecordFields很好用,但未来很可能会得到支持吗?
有时,如果没有至少一种语言扩展,我想写的一段代码是不合法的.当试图在研究论文中实现这些想法时尤其如此,这些论文倾向于使用在撰写论文时可用的任何spiffy,超扩展版本的GHC,而没有明确实际需要哪些扩展.
结果是我经常在我的.hs文件的顶部找到这样的东西:
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FunctionalDependencies
, FlexibleContexts
, FlexibleInstances
, UndecidableInstances
, OverlappingInstances #-}
Run Code Online (Sandbox Code Playgroud)
我不介意,但我常常觉得我正在做出盲目的牺牲来安抚GHC的大神.它抱怨如果没有语言扩展X,某段代码无效,所以我为X添加了一个pragma.然后它要求我启用Y,所以我为Y添加了一个pragma.到这个结束时,我已经启用我不太了解的三个或四个语言扩展,我不知道哪些是"安全的".
用"安全"来解释我的意思:
我明白这UndecidableInstances是安全的,因为虽然它可能导致编译器不终止,只要代码编译它就不会有意想不到的副作用.
另一方面,OverlappingInstances显然是不安全的,因为它使我很容易意外地编写产生运行时错误的代码.
所以我的问题是:
是否有GHCextensions列表被认为是"安全的"并且"不安全"?
我想将Haskell类型的Convertible实例写入其C表示
它看起来像这样:
instance Convertible Variable (IO (Ptr ())) where
Run Code Online (Sandbox Code Playgroud)
现在GHC抱怨:
Illegal instance declaration for `Convertible
Variable (IO (Ptr ()))'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `Convertible Variable (IO (Ptr ()))'
Run Code Online (Sandbox Code Playgroud)
如果你的实例声明中有自由类型,我认为需要灵活实例,但事实并非如此.我可以在添加正确的pragma时进行编译,但有人可以解释为什么我需要这个吗?
GHC有一个类型系统扩展的整个动物园:多参数类型类,功能依赖,秩n多态,存在类型,GADT,类型族,范围类型变量等等.哪些可能是最容易学习的?另外,这些功能是否以某种方式组合在一起,或者它们是否完全相同,可用于完全不同的目的?