- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
B-6ren">
我正在尝试设计一个玩具 CoversionRate
实现,以了解如何通过链式隐式定义对“定律”进行编码。编译以下代码:
case class ConversionRate[X <: Currency, Y <: Currency](rate: Double) extends AnyVal
object ConversionRate {
implicit val EUR2USD: ConversionRate[EUR.type, USD.type] = ConversionRate(1.1)
implicit val GBP2USD: ConversionRate[GBP.type, USD.type] = ConversionRate(1.21)
// "Laws"
implicit def inverse[X <: Currency, Y <: Currency](implicit cr: ConversionRate[X, Y]): ConversionRate[Y, X] =
ConversionRate[Y, X](1 / cr.rate)
implicit def transitivity[X <: Currency, Z <: Currency](implicit cr: ConversionRate[X, USD.type], cr2: ConversionRate[Z, USD.type]): ConversionRate[X, Z] =
ConversionRate(cr.rate * cr2.rate)
private val unit = ConversionRate(1)
implicit def self[X <: Currency]: ConversionRate[X,X] = unit.asInstanceOf
}
调用站点推导确实不有效
val cr = implicitly[ConversionRate[EUR.type, GBP.type]]
diverging implicit expansion for type ConversionRate[EUR.type,GBP.type]
starting with method transitivity in object ConversionRate
我应该如何以可用于推导的方式编写定律?
最佳答案
隐式不能派生出任何你可以从你的规则中组合出来的可能类型,因为它很容易在你有无限种可能性的情况下结束:
id[X]: X => X
x: A => B
y: B => C
可以组成
z = x andThen y
但也许它可以生成
z = x andThen id[B] andThen y // or
z = id[A] andThen x andThen y // or
z = x andThen y andThen id[C] // or
z = id[A] andThen x andThen y andThen id[C] //
...
你知道这是怎么回事吗?
同时推导应该是明确的,当你从你的“原始”隐式开始并试图将它们组合成你的“目标”隐式时,应该只有一种可能的方法。一旦 Scala 发现存在歧义,它就会停止推导。
在您的示例中,您将 ConversionRate[X, USD]
与 ConversionRate[Y, USD]
组合成 ConversionRate[X, Y]
.但它不会阻止你做类似的事情:
ConversionRate[USD, USD] combine with
ConversionRate[USD, USD] combine with
ConversionRate[USD, USD] combine with...
实现此目的的一种方法是定义您的转换,以便只有一种方法可以实现,您不能轻易破坏,例如:
case class USDConversionRate[A <: Currency](rate: Double)
// implicit conversion rates
case class ConversionRate[X <: Currency, Y <: Currency](rate: Double) extends AnyVal
object ConversionRate {
implicit def combine[X <: Currency, Y <: Currency](
implicit
ev1: X =:!= USD.type, // available in shapeless
ev2: Y =:!= USD.type, // proves type inequality
ev3: X =:!= Y, // which we use to force only one way to derive each pair
xFromUSD: USDConversionRate[X],
yFromUSD: USDConversionRate[Y],
): ConversionRate[X, Y] = ...
implicit def toUSD[X <: Currency](
implicit X =:!= USD.type,
xFromUSD: USDConversionRate[X]
): ConversionRate[X, USD.type] = ...
implicit def fromUSD[X <: Currency](
implicit X =:!= USD.type,
xFromUSD: USDConversionRate[X]
): ConversionRate[USD.type, X] = ...
implicit def unit: ConversionRate[X, X] = ...
}
在这里,您将使用类型边界来切断所有循环。如果您使用例如,在原始代码中它们会出现inverse
(因为任何派生 X -> Y 的东西都会与 inverse(inverse(X -> Y))
冲突),等等,与 traverse
和 unit
等。您必须保证扩展不会发散,并且禁止任何会导致循环或任何其他 2 种不同方式获得相同类型的东西。
您最大的问题是,使用这样的 2 个参数组合:A -> B
,您总是可以尝试通过其他方式来完成此操作 A -> C -> B
, A -> D -> B
,所以最好的方法是消除任何可能的额外步骤。我的提议是,您仅从 USD -> X 转化率得出 A -> B 转化率,并防止每次转化与另一次转化发生冲突,完全禁止循环。
关于scala - 编写隐式推导 "Laws",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60742961/
我们最近的类(class)是关于德摩根定律的。我已经有点明白了 (A+B)' = A'B' (AB)' = A'+B' 我遇到了有关此类法律的一个具体问题,我想澄清一下 ((A'B')+(AB))'
我需要将A-Law压缩文件转换为常规的未压缩PCM。有没有我可以看的源代码? 最佳答案 看AlawCodec.java。 有趣的事情在该类的静态块中,该块中的初始化解码表和read方法。 关于audi
我正在尝试了解如何正确使用被动 View 。在我看来,我在被动 View 上看到的每个例子都违反了德米特法则: //In the presenter code myview.mytextfield.t
我正在尝试设计一个玩具 CoversionRate 实现,以了解如何通过链式隐式定义对“定律”进行编码。编译以下代码: case class ConversionRate[X X x: A => B
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8 年前关闭。 Improve this
在 Evolution of JPEG 上学习本文档时,我在上述文档的第7.3节中遇到了“八定律”。 Despite the introduction of other block sizes fro
一些Rust特征的文档包括“法律”部分,例如num::traits::identities::One的documentation包括以下内容: Defines a multiplicative ide
如果我有一个包含方法 f 的类 C,该方法将 D 类型的对象(我定义的另一个类)作为参数 如果我在方法f中调用对象D的方法,是否会违反得墨忒耳定律?为什么? 例如: public C { pu
我在用 LiquidHaskell 证明以下定律时遇到了麻烦: 它被称为(之一)德摩根定律,并简单地说明了 or 的否定。两个值必须与 and 相同否定每个。它已经被证明了很长时间,并且是 Liqui
我最近才知道 Law of Demeter . 像很多事情一样,我意识到这是我已经在做但没有名字的事情。虽然有几个地方我似乎违反了它。 例如... 我可能有一个地址对象: public class A
如何将具有编码:ALaw,SampleRate:8000,BitsPerSample:8, channel :1, block 对齐 channel :1,每秒位数:8000 的波转换为具有 pcm
我在过去 2 周内搜索了这个问题,但无法找到算法或解决方案。我有一些简短的 .wav 文件,但它有 MULAW 压缩,而 python 内部似乎没有功能 wave.py可以成功解压它。所以我决定自己在
我已经安装了 networkx 和 matplotlib 包。如何根据度相关性生成幂律图,即具有高或低同质度的图 最佳答案 您看过 Networkx 站点上的示例了吗? This example可能会
我想从字节码播放音频文件。我已经有了音频文件的字节码。但是当我使用 System.Media.SoundPlayer 播放时,出现错误“{Sound API 仅支持播放 PCM 波形文件。”}。我的音
无法找到一种方法来按照以下问题将CCITT u-Law波形文件编程转换为PCM文件(Soundplayer要求):How to play non-PCM file or convert it to P
由于我对音频编解码器的理解有限,请多多包涵。我有来自 IPCAM 的音频源(通过 htto//... CGI 接口(interface))。我正在尝试编写几个客户端程序来在 Windows、MAC 以
我需要将 wav 文件从 FORMAT 1 转换为 FORMAT 2 格式 1:μ-law,8000Hz,64 kbps,单声道 格式 2:容器WAV编码PCM评分 16K样本格式 16 位 chan
我想在 python2.7 下面做。它适用于 2 个子元素,但我可以有多个子元素。 NOT = "not" OR = "or" AND = "and" def convertMain(prop) :
我正在尝试通过日志分析保存的搜索创建用于更新管理的计算机组,但无法完全弄清楚。 使用此查询时,它将列出名称中包含“test”的所有计算机。工作正常,但不完全是我想要的。 Heartbeat | wh
我正在尝试使用 Props 更改组件 vue-cookie-law 的 buttonText 默认值。 我可以直接从node_modules插件源代码更改默认值,但我想从Vue单文件组件更改它。 vu
我是一名优秀的程序员,十分优秀!