Haskell 存在量化构造函数列表

Haskell 存在量化构造函数列表,haskell,ghci,monomorphism-restriction,Haskell,Ghci,Monomorphism Restriction,我有以下数据类型: {-#语言存在量化} {-#语言扩展DefaultRules} 类ToString a where 数据M=全部a。(ToString a)=>B a 在GHCI中,我可以毫无问题地执行以下操作: 让bs=[B,B] 但如果我尝试在编译文件中执行此操作,则会出现以下错误: 没有因使用“B”而产生的(ToString a0)实例 类型变量“a0”不明确 相关绑定包括 bs::[a0->M](绑定在src/My/Module:7:1) 我缺少哪个扩展名可以创建B列表,如图所示

我有以下数据类型:

{-#语言存在量化}
{-#语言扩展DefaultRules}
类ToString a where
数据M=全部a。(ToString a)=>B a
在GHCI中,我可以毫无问题地执行以下操作:

让bs=[B,B]

但如果我尝试在编译文件中执行此操作,则会出现以下错误:

没有因使用“B”而产生的(ToString a0)实例
类型变量“a0”不明确
相关绑定包括
bs::[a0->M](绑定在src/My/Module:7:1)

我缺少哪个扩展名可以创建
B
列表,如图所示?或者说,我遗漏了GHCI正在添加的哪些内容?

这是因为GHCI没有打开单态限制,而GHC(默认情况下)会打开。要进行见证,请执行以下文件类型检查:

{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE NoMonomorphismRestriction #-}

class ToString a where

data M = forall a. (ToString a) => B a

bs = [B, B]
当然,
bs
的推断类型是相当无用的:

*Main> :t bs
bs :: ToString a => [a -> M]
如果不想关闭单态限制,只需在
bs
的定义中添加一个类型签名即可:

{-# LANGUAGE ExistentialQuantification #-}

class ToString a where

data M = forall a. (ToString a) => B a

bs :: (ToString a) => [a -> M]
bs = [B, B]

这是因为GHCi不启用单态限制,而GHC(默认情况下)启用。要进行见证,请执行以下文件类型检查:

{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE NoMonomorphismRestriction #-}

class ToString a where

data M = forall a. (ToString a) => B a

bs = [B, B]
当然,
bs
的推断类型是相当无用的:

*Main> :t bs
bs :: ToString a => [a -> M]
如果不想关闭单态限制,只需在
bs
的定义中添加一个类型签名即可:

{-# LANGUAGE ExistentialQuantification #-}

class ToString a where

data M = forall a. (ToString a) => B a

bs :: (ToString a) => [a -> M]
bs = [B, B]

这解决了我的问题。了解所有这些GHC语言扩展本身就是一门艺术:-)@kurzweil4:现在想象一下,在你的日常工作中使用另一个(专有的)Haskell编译器,它有自己的怪癖……我希望GHC只说“好的,我们是Haskell”,然后就结束了。然后,他们可以添加任意多的功能,而不受某些旧标准的限制。然后,他们可以将“GHC Haskell”的规范发布为Haskell,如果其他人想制作编译器,只需遵循他们的规范即可。据我所知,他们是镇上唯一(重要的)游戏。也许这可以消除所有这些语言杂注的需要?@Cactus,我不知道有一个专有的Haskell编译器。那是什么样的?我知道决定哪些应该包括在内会有争议,但如果你能简单地说
{-#LANGUAGE GhcAll-#}
并立即获得所有扩展就好了。必须有一些相当大的扩展子集,以最小的编译或运行时影响覆盖大多数使用。这解决了我的问题。了解所有这些GHC语言扩展本身就是一门艺术:-)@kurzweil4:现在想象一下,在你的日常工作中使用另一个(专有的)Haskell编译器,它有自己的怪癖……我希望GHC只说“好的,我们是Haskell”,然后就结束了。然后,他们可以添加任意多的功能,而不受某些旧标准的限制。然后,他们可以将“GHC Haskell”的规范发布为Haskell,如果其他人想制作编译器,只需遵循他们的规范即可。据我所知,他们是镇上唯一(重要的)游戏。也许这可以消除所有这些语言杂注的需要?@Cactus,我不知道有一个专有的Haskell编译器。那是什么样的?我知道决定哪些应该包括在内会有争议,但如果你能简单地说
{-#LANGUAGE GhcAll-#}
并立即获得所有扩展就好了。必须有一些相当大的扩展子集,以最小的编译或运行时影响覆盖大多数使用。