类型推断和隐式链接

环保

这是一个简化的例子

我有以下代码:

import scala.language.implicitConversions

trait Mapping[I, O]
trait KeyMapping[K, I, O]

implicit def toMapping[I, O](s: I => O): Mapping[I, O] = ???
implicit def toKeyMapping[K, I, O](s: (K, I => O))(
    implicit ev: (I => O) => Mapping[I, O]): KeyMapping[K, I, O] = ???

def test[K, I, O, M](s: M)(
    implicit ev: M => KeyMapping[K, I, O]
):KeyMapping[K, I, O] = ???

val x = test(1 -> {s:String => true})
            ^

这给出了以下错误:

type mismatch;
found: ((Int, Nothing => Boolean)) => KeyMapping[Int,Nothing,Boolean]
required: ((Int, String => Boolean)) => KeyMapping[Int,Input,Boolean]

为什么是这样?

这可以解决吗?

环保

我通过使用隐式转换器而不是隐式转换来解决它。

import scala.language.implicitConversions

trait Mapping[I, O]
trait KeyMapping[K, I, O]

trait MappingConverter[M, I, O] {
  def convert(m: M): Mapping[I, O]
}

trait KeyMappingConverter[M, K, I, O] {
  def convert(m: M): KeyMapping[K, I, O]
}

implicit def toMapping[I, O] =
  new MappingConverter[I => O, I, O] {
    def convert(m: I => O): Mapping[I, O] = ???
  }

implicit def toKeyMapping[K, I, O, M](
  implicit mapping: MappingConverter[M, I, O]) =
  new KeyMappingConverter[(K, M), K, I, O] {
    def convert(m: (K, M)): KeyMapping[K, I, O] = ???
  }

def test[K, I, O, M](s: M)(
  implicit converter: KeyMappingConverter[M, K, I, O]): KeyMapping[K, I, O] = ???

val x = test(1 -> { s: String => true })

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Lambda类型推断和隐式转换

来自分类Dev

模板的推断类型和隐式类型转换有什么问题?

来自分类Dev

从返回类型推断通用隐式参数的类型

来自分类Dev

隐式类型和通配符

来自分类Dev

隐式解析的匿名函数的Scala类型推断

来自分类Dev

C#-隐式转换或推断通用返回类型

来自分类Dev

TypeScript:从对象内容隐式推断通用接口的对象类型

来自分类Dev

Haskell中不完整的隐式类型推断

来自分类Dev

隐式参数和类型族

来自分类Dev

隐式参数和通用类型

来自分类Dev

隐式参数中断类型推断还是不足以解决它们的解析?

来自分类Dev

C#中的隐式链接和FreeLibrary

来自分类Dev

类型相关的隐式

来自分类Dev

Haskell类型隐式

来自分类Dev

Scala宏如何推断隐式的CanBuildFrom

来自分类Dev

Scala-抽象类型和隐式参数解析

来自分类Dev

类型类和包对象的奇怪的隐式解析行为

来自分类Dev

类型参数的统一和隐式转换

来自分类Dev

TSQL中的ISNULL和隐式数据类型转换

来自分类Dev

隐式网络类型声明和`default-nettype

来自分类Dev

函数的隐式声明和冲突类型-AVR

来自分类Dev

推断类型和动态类型

来自分类Dev

依赖类型的隐式扩展

来自分类Dev

快速隐式转换类型

来自分类Dev

C ++隐式类型转换

来自分类Dev

函数类型的隐式转换

来自分类Dev

隐式使用结构类型

来自分类Dev

C ++隐式类型转换

来自分类Dev

子类类型的隐式写