- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试抽象出针对特定类型触发的 json 解析逻辑。
我开始创建 Parser 特征,如下所示:
trait Parser {
def parse[T](payload : String) : Try[T]
}
class JsonParser extends Parser {
override def parse[T](payload: String): Try[T] = parseInternal(payload)
private def parseInternal[T:JsonParserLike](payload:String):Try[T] = {
implicitly[JsonParserLike[T]].parse(payload)
}
}
trait JsonParserLike[T] {
def parse(payload: String): Try[T]
}
object JsonParserLike {
implicit val type1Parser:JsonParserLike[Type1] = new JsonParserLike[Type1]
{
//json parsing logic for Type1
}
implicit val type2Parser:JsonParserLike[Type2] = new JsonParserLike[Type2]
{
//json parsing logic for Type2
}
}
ambiguous implicit values:
[error] both value type1Parse in object JsonParserLike of type => parser.jsonutil.JsonParserLike[parser.models.Type1]
[error] and value type2Parser in object JsonParserLike of type => parser.jsonutil.JsonParserLike[parser.models.Type2]
[error] match expected type parser.jsonutil.JsonParserLike[T]
[error] override def parse[T](payload: String): Try[T] = parseInternal(payload)
parse
Parser
中的方法trait 没有类型参数
T
的参数?
trait Parser {
def parse[T](payload : String) : Try[T]
}
class JsonParser extends Parser {
override def parse[T](payload: String): Try[T] = {
import workflow.parser.JsonParserLike._
parseInternal[T](payload)
}
private def parseInternal[U](payload:String)(implicit c:JsonParserLike[U]):Try[U] = {
c.parse(payload)
}
}
could not find implicit value for parameter c: parser.JsonParserLike[T]
[error] parseInternal[T](payload)
[error]
^
scala> case class Type1(name: String)
defined class Type1
scala> case class Type2(name:String)
defined class Type2
scala> :paste
// Entering paste mode (ctrl-D to finish)
import scala.util.{Failure, Success, Try}
trait JsonParserLike[+T] {
def parse(payload: String): Try[T]
}
object JsonParserLike {
implicit val type1Parser:JsonParserLike[Type1] = new JsonParserLike[Type1] {
override def parse(payload: String): Try[Type1] = Success(Type1("type1"))
}
implicit val type2Parser:JsonParserLike[Type2] = new JsonParserLike[Type2] {
override def parse(payload: String): Try[Type2] = Success(Type2("type2"))
}
}
// Exiting paste mode, now interpreting.
import scala.util.{Failure, Success, Try}
defined trait JsonParserLike
defined object JsonParserLike
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait Parser {
def parse[T](payload : String) : Try[T]
}
class JsonParser extends Parser {
override def parse[T](payload: String): Try[T] = parseInternal(payload)
private def parseInternal[T:JsonParserLike](payload:String):Try[T] = {
implicitly[JsonParserLike[T]].parse(payload)
}
}
// Exiting paste mode, now interpreting.
<pastie>:24: error: ambiguous implicit values:
both value type1Parser in object JsonParserLike of type => JsonParserLike[Type1]
and value type2Parser in object JsonParserLike of type => JsonParserLike[Type2]
match expected type JsonParserLike[T]
override def parse[T](payload: String): Try[T] = parseInternal(payload)
最佳答案
正如我已经尝试在评论中解释的那样,问题在于方法
override def parse[T](payload: String): Try[T] = parseInternal(payload)
JsonParserLike[T]
实例。因此,编译器无法插入
JsonParserLike[T]
的正确实例。在调用站点(类型
T
是已知的)。
T
的 token 。到
parse
的参数列表.一种粗略的方法是添加
JsonParserLike[T]
本身:
import util.Try
trait Parser {
def parse[T: JsonParserLike](payload : String) : Try[T]
}
class JsonParser extends Parser {
override def parse[T: JsonParserLike](payload: String): Try[T] =
parseInternal(payload)
private def parseInternal[T:JsonParserLike](payload:String):Try[T] = {
implicitly[JsonParserLike[T]].parse(payload)
}
}
trait JsonParserLike[T] {
def parse(payload: String): Try[T]
}
object JsonParserLike {
implicit val type1Parser: JsonParserLike[String] = ???
implicit val type2Parser: JsonParserLike[Int] = ???
}
JsonParserLike[T]
parseInternal
要求作为隐式参数自动插入到
parse
.
Parser
之间创建了硬依赖关系。接口(interface)和
JsonParserLike
类型类。您可能想从
shapeless.Typeable 之类的东西中获得一些灵感。摆脱
JsonParserLike
在
Parser
接口(interface),或者只依赖
circe马上。
关于scala - Typeclass 的模棱两可的隐含值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352288/
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 代码时,经常进行非空和非零测试,重写所有此类测试以进行适当比较非常乏味)。这样做很容易,
我是一名优秀的程序员,十分优秀!