- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编码
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
-- I know this particular example is silly.
-- But that's not the point here.
g :: forall a . RealFloat a => Bool
g = True
main :: IO ()
main = print (g @Double)
• Could not deduce (RealFloat a0)
from the context: RealFloat a
bound by the type signature for:
g :: RealFloat a => Bool
at app/Main.hs:3:6-35
The type variable ‘a0’ is ambiguous
• In the ambiguity check for ‘g’
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the type signature:
g :: forall a. RealFloat a => Bool
AllowAmbiguousTypes
将使代码编译。
AllowAmbiguousTypes
到底是什么? AllowAmbiguousTypes
在这个特定的代码中给了我比我真正想要的更多。听起来很吓人。听起来这会使 Haskell 的类型系统变得不那么安全,也许在与此特定代码无关的其他领域。这些恐惧是没有根据的吗? a0
我从未要求过的类型变量。是否没有扩展告诉 Haskell 不要创建这些无关的类型变量 - 并且只使用我明确告诉它添加的那些我自己明确的 forall a
? AllowAmbiguousTypes
用词不当?将它命名为 AllowUnusedTypeVariables
会更好吗? ? 最佳答案
What exactly is
AllowAmbiguousTypes
?
ty
是模棱两可的当且仅当
((undefined :: ty) :: ty)
无法进行类型检查”。扩展
AllowAmbiguousTypes
只是禁用此检查 - 它不会允许错误类型的程序通过。
Why is it needed to make this particular code work?
RealFloat a
满足
g
使用,GHC需要知道什么
a
是。你没有办法(在 vanilla Haskell1 中)告诉 GHC 什么
a
应该是因为
a
g
类型中没有其他地方出现.再多的注释都不会让你使用
g
不会出现模棱两可的类型变量错误。
g
在任何地方,您仍然可以通过打开
AllowAmbiguousTypes
来编译您的代码。 .
I fear that adding
AllowAmbiguousTypes
is giving me more than I really want in this particular code. It sounds scary. It sounds like it will make Haskell's type system less safe, perhaps in other areas that have nothing to do with this particular code. Are these fears unfounded?
TypeApplications
1),而不会导致模棱两可的类型变量错误。禁用此检查仅意味着当您使用表达式(或函数)而不是在其定义站点时,您将看到模棱两可的类型变量消息。
Are there any alternatives? In this case, it seems like Haskell is inserting a
a0
type variable that I never asked for. Is there no extension to tell Haskell not to create these extraneous type variables - and only use those that I explicitly told it to add with my own explicitforall a
?
a0
来自我在这个答案开头提到的歧义检查。 GHC 仅使用名称
a0
明确表示它与
a
不同.歧义检查基本上只是尝试进行类型检查
((undefined :: forall a. RealFloat a => Bool) :: forall a0. RealFloat a0 => Bool)
AllowAmbiguousTypes
删除此检查。我不认为有一个扩展只对具有显式
forall
的类型签名禁用歧义检查。 s (虽然这可能是整洁和有用的!)。
Would you say that
AllowAmbiguousTypes
is a misnomer? Would it have been better named asAllowUnusedTypeVariables
?
Monad
被称为
FlatMapAble
。)
TypeApplications
(这是 GHC 8.0 的一个相对较新的扩展),确实没有办法使用触发歧义检查的表达式而不会出现歧义类型变量错误,所以
AllowAmbiguousTypes
没那么有用了。
关于haskell - 什么是 AllowAmbiguousTypes,为什么在这个 "forall"示例中需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45128492/
标题和标签应充分解释问题。 最佳答案 Title and tags should explain the question adequately. 呃,不是真的。您使用了标签 existential-
以 Haskell 中简单的恒等函数为例, id :: forall a. a -> a 鉴于 Haskell 据称支持谓语多态性,我应该能够将 id“限制”为类型 (forall a.a -> a)
Ltac checkForall H := let T := type of H in match T with | forall x, ?P x => idtac | _ =
如何在 Coq 中证明 (forall x, P x/\Q x) -> (forall x, P x)?已经尝试了几个小时,但不知道如何分解 Coq 可以消化的东西的前因。 (我是新手,显然:) 最佳
是否可以编写类型的单射函数 hard :: (forall n . Maybe (f n)) -> Maybe (forall n . (f n)) 作为total functional progra
我试图理解使用 forall 量化两个类型变量和使用 forall 量化元组类型的单个类型变量之间的区别。 例如,给定以下类型系列: {-# LANGUAGE RankNTypes #-} {-# L
在证明中,我需要证明“如果 n 不是三的倍数,那么 n+n 也不是三的倍数”。我认为我的证明太长而且不是很优雅。有没有更漂亮的写法?有没有ssreflect? (我确定 ssreflect 中有一个
从我收集到的有关 agda 的零碎信息中,我(显然是错误地)得出的结论是 ∀ {A}相当于 {A : Set} .现在我注意到 flip : ∀ {A B C} -> (A -> B -> C) ->
如果我不想查看列表中的每个元素是否与另一个列表中相同索引的元素正确对应,我可以使用 forall 来执行此操作吗?例如类似的东西 val p=List(2,4,6) val q=List(1,2,3)
我尝试使用 Function 来使用度量来定义递归定义,但收到错误: Error: find_call_occs : Prod 我在底部发布了整个源代码,但我的功能是 Function kripke_
我一直在阅读existential section维基教科书中的内容如下: Firstly, forall really does mean 'for all'. One way of thinkin
从 ghc-8.0 开始,我们有一个非常好的扩展,称为 TypeApplications。这允许我们代替: λ> show (5 :: Int) "5" 这样做: λ> :set -XTypeAppl
我阅读了HaskellWiki关于数据构造函数并考虑以下内容: 2.1 Data constructors as first class values Data constructors are fi
我想证明以下定理: Theorem Frobenius (A: Set) (q: Prop) (p: A -> Prop) : (q \/ forall x : A, p x) -> (foral
我遇到了一个函数无法进行类型检查的情况,除非我在其类型签名的开头显式添加一个 forall。 有问题的功能是: test :: (Typeable a) => a -> a test x |
看来需要明确说forall在数据定义中有参数类型。例如,这 data A = A (forall s. ST s (STUArray s Int Int)) 将工作,而这 data A = A (ST
我对哈姆雷特有一个奇怪的问题。我正在尝试使用 $forall 遍历列表,但我不断收到“不在范围内”错误。我在 Win7 上运行 yesod 0.9.2.2。 除了糟糕的设计,有人知道我哪里出错了吗?删
考虑以下表: object MyTestsFactory { val testCases = Table( ("testName", "input", "output"), ("t
我正在通过阅读“Certified Programming with Dependent Types”一书来学习 Coq,但我在理解问题时遇到了问题 forall句法。 举个例子,让我们考虑一下这种相
可以使用 GADT 来表达 Existentially quantified 类型。 我看到 GADT 更通用 - data-type-extensions ,第 7.4.7 节 什么时候使用存在量化
我是一名优秀的程序员,十分优秀!