- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
:set -XTypeAppl-6ren">
从 ghc-8.0 开始,我们有一个非常好的扩展,称为 TypeApplications
。这允许我们代替:
λ> show (5 :: Int)
"5"
这样做:
λ> :set -XTypeApplications
λ> show @Int 5
"5"
这真的很酷。当我们添加更多类型变量时,它会变得更加复杂,但是有一些规则可以用来确定确切的顺序,并且它们有很好的文档记录:
showFooBar :: (Show a, Show b) => a -> b -> String
showFooBar a b = show a ++ " and " ++ show b
因此,在上面的函数中,我们首先提供 a
,然后提供 b
:
λ> showFooBar @Int @Double 3 4
"3 and 4.0"
太好了,但是如果我想更改顺序怎么办?没问题,我们可以使用 ExplicitForAll
扩展(或其他暗示它的扩展)来指定它:
{-# LANGUAGE ExplicitForAll #-}
showFooBar :: forall b a . (Show a, Show b) => a -> b -> String
showFooBar a b = show a ++ " and " ++ show b
现在我们颠倒了要应用的类型的顺序:
λ> showFooBar @Int @Double 3 4
"3.0 and 4"
问题是我似乎无法弄清楚如何对属于类型类的函数实现相同的效果。考虑这个例子:
{-# LANGUAGE MultiParamTypeClasses #-}
class (Show a, Show b) => FooBar a b where
fooBarClassFunc :: a -> b -> String
我现在无法将 forall
放在函数上(例如 fooBarClassFunc::forall a b . a -> b -> ..
,因为这会改变含义该函数显然无法编译。
那么,问题是,如何在类型类方法中更改类型变量的顺序以实现 TypeApplication
的目的?
编辑
以防万一,我尝试了 InstanceSigs
扩展,就 TypeApplications
而言,它完全忽略了 forall
类型变量的顺序,这是一件好事,否则我们最终会得到由实例而不是类决定的行为。
最佳答案
how do you change the order of type variables for the purpose of
TypeApplication
inside the type class methods?
我认为@luqui 的回答已经足够好了。但为什么不这样呢:
class (Show b, Show a) => FooBar b a where
fooBarClassFunc :: a -> b -> String
您只有一个方法,因此驱动类参数顺序的唯一考虑因素是为了方法内的 TypeApplication
的目的。
如果您有两个或多个方法,您希望 TypeApplication 的顺序不同(@chi 的观点,但为什么?),那么对于其他方法,要么 luqui 的建议,要么(等效地) ) 具有父类(super class)约束和默认实现的另一个类。
class (Show a, Show b, FooBar b a) => OtherFooBar a b where
otherFooBarClassFunc :: a -> b -> String
otherFooBarClassFunc = otherFooBarClassFunc' -- default
instance {-# NOOVERLAPPABLE #-} OtherFooBar a b where {} -- take default
(假设 otherFooBarClassFunc'
在主类中定义;这就是实际实例定义的地方。)
one method per class 有很多话要说。 ,当然。
{-# NOOVERLAPPABLE #-}
我们不知道这是我的小笑话。
关于haskell - 在类型类函数上显式 forall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54700136/
标题和标签应充分解释问题。 最佳答案 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 节 什么时候使用存在量化
我是一名优秀的程序员,十分优秀!