- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在读《Learn You a Haskell》一书,并且正在尝试了解 Haskell 类型类。作为练习,我尝试创建一个简单的向量类型类。下面的代码片段让我有些悲伤(导致我在 StackOverflow 上发表了第一篇文章):
data Vec2 a = Vec2 (a,a) deriving (Show, Eq, Read)
class Vector a where
(<*) :: (Num b) => a -> b -> a
instance (Num a) => Vector (Vec2 a) where
Vec2 (x,y) <* a = Vec2 (a*x, a*y)
我收到以下错误消息:
Could not deduce (a~b) from the context (Num a) or from (Num b) bound by the type signature for
<* :: Num b => Vec2 a -> b -> Vec2 a
看起来类型类中指定的 Num
应该提供 a
的类型,并且实例中的 Num a
规范应该提供x
和 y
的类型,那么它为什么会提示呢?我对这段代码有什么误解?
最佳答案
(*) :: Num a => a -> a -> a
的类型。但是当你真正尝试使用 *
时,您实际上是将两个不相关的类型相乘 Num
实例和编译器无法推断它们是相同的。
为了更清楚地解释它,请查看 <*
的类型以及 b
的通用量化
(<*) :: (Num b) => a -> b -> a
你在这里所说的是,给我任何具有 Num
的类型实例,我将能够将其与我的向量相乘,但你想说的是不同的东西。
你需要一些怎么说 a
类型 Vec2 a
与 b
相同类型 (<*) :: Num b => a -> b -> a
,只有这样你才能将它们相乘。这是使用类型族来确保此约束的解决方案。
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
data Vec2 a = Vec2 (a,a) deriving (Show, Eq, Read)
class (Num (VectorOf a)) => Vector a where
type VectorOf a :: *
(<*) :: a -> (VectorOf a) -> a
instance (Num a) => Vector (Vec2 a) where
type VectorOf (Vec2 a) = a
Vec2 (x,y) <* a = Vec2 (a*x, a*y)
关于Haskell Typeclass 类型约束和推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284798/
Require Import Relations RelationClasses. Section MySection. Variable A : Type. Variable R : rel
我试图编译这段代码。 symmetric [] = True symmetric [_] = True symmetric l | (head l) == (last l) = symmetr
我正在尝试制作 Semigroup和 VerifiedSemigroup我的自定义实例 Bool运算符 && 上的数据类型和运算符(operator) || : %case data Lógico =
我为 Int 类型的类型类 Ord 定义了一个命名实现。 [mijnOrd] Ord Int where compare n1 n2 = ... 如何导入此命名实现并将其用作“默认” 所以在另一个
我写了一个 Haskell 风格的 Functor 类型类: Class Functor (f: Type -> Type) := { map {a b: Type}: (a -> b) -> (
我缺少什么关键的直觉来理解这段代码?我不明白这些是怎么组成的。首先需要一个函数 (a->c) 和构造类型 (f a b)。然而,第二个产量(f a d)。此外,first 和 second 是根据 b
如何在 Coq 中展开类实例?似乎只有当实例不包含证明或其他东西时才有可能。考虑一下: Class C1 (t:Type) := {v1:t}. Class C2 (t:Type) := {v2:t;
我一直在尝试使用指定 eval 函数的 Component 类型类在 Purescript 中开发组件系统。 eval 函数可以由组件的每个子组件递归调用,实质上是获取输入的值。 由于组件可能希望使用
我无法理解Coq中类型类和相关记录之间的区别。引用手册提供了类型类的语法,但没有说明它们的真正含义以及如何使用它们。一点思考和搜索表明,类型类本质上是从属记录,带有一些语法糖,可以使Coq自动推断一些
考虑这个伊莎贝尔代码 theory Scratch imports Main begin datatype Expr = Const nat | Plus Expr Expr 实例化 plus 是很合
因此,我有一对类型类,我将经常一起使用它们,并且我想避免每次都指定它们。基本上,而不是把 :: (Ord a, Fractional a, Ord b, Fractional b, ... Ord z
我一直在读《Learn You a Haskell》一书,并且正在尝试了解 Haskell 类型类。作为练习,我尝试创建一个简单的向量类型类。下面的代码片段让我有些悲伤(导致我在 StackOverf
我正在尝试在 Nim 中简单地使用类型类。请记住,我从今天早上才开始使用 Nim,所以我可能做了一些愚蠢的事情。 无论如何,我想定义一个伪随机生成器来生成 T 类型的值流。有时 T 是数字,因此了解可
我正在尝试抽象出针对特定类型触发的 json 解析逻辑。 我开始创建 Parser 特征,如下所示: trait Parser { def parse[T](payload : String) :
我现在在一个项目上使用 PureScript 并遇到了一些实例(我是新手,并且正在像我一样学习)。基本上我必须创建一个实例才能重载具有不同类型的函数。 public String toStr(Inte
我正在尝试编写一个类型类,以简化使用持久性、aeson 和 scotty 编写 CRUD 后端 这是我的想法: runDB x = liftIO $ do info CRUD a where
我正在尝试在 Haskell 中编写一个简单的遗传算法。我认为第一步应该是为“遗传”的个体创建一个类型类,如下所示: class Genetic a where fitness :: (Ord
为什么 mathlib 对 UFD 的定义是这样的: class unique_factorization_domain (α : Type*) [integral_domain α] := (fac
我有一个非常简单的data,我想使用Show类型类来给它一个很好的输出。 data Fruit = Apple | Orange Int instance Show Fruit wh
我想为大多数类型提供一个 ToCondition 操作,但不为字符串提供。 (这是在移植 Javascript 代码时,经常进行非空和非零测试,重写所有此类测试以进行适当比较非常乏味)。这样做很容易,
我是一名优秀的程序员,十分优秀!