首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么scala不能推断Left [X,A]是[X,B]的合理子类型?

这个问题涉及到Scala编程语言中的类型推断和子类型的概念。在Scala中,类型推断是指编译器自动推断变量、函数参数和返回值的类型,而子类型是指一个类型可以被另一个类型继承或实现的关系。

对于这个问题,我们需要先了解一下Scala中的Left类型。Left是Scala中的一个类型,用于表示Either类型的左侧值。Either是Scala中的一个类型,用于表示一个值可以是两种类型之一。因此,Left类型的定义如下:

代码语言:txt
复制
sealed abstract class Left[+A, +B] extends Either[A, B]

在这个定义中,Left类型是一个泛型类型,它有两个类型参数A和B。这里的+号表示A和B是协变的,即如果A是B的子类型,则LeftA,B也是LeftX,B的子类型。

现在我们来看这个问题:为什么Scala不能推断LeftX,A是X,B的合理子类型?这个问题的关键在于Scala的类型推断机制。在Scala中,类型推断是基于类型变量的约束条件进行的。在这个问题中,Scala编译器无法确定X是否是A的子类型,因此无法推断LeftX,A是LeftX,B的子类型。

为了解决这个问题,我们可以使用类型注释或类型转换来明确指定类型。例如:

代码语言:txt
复制
val left: Left[X, A] = ...
val leftB: Left[X, B] = left.asInstanceOf[Left[X, B]]

这里我们使用了asInstanceOf方法来强制将LeftX,A转换为LeftX,B。需要注意的是,这种转换可能会导致运行时异常,因此应该谨慎使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Scala类型推导Scala类型推导

Scala类型推导 之剑 2016.5.1 00:38:12 类型系统 什么静态类型为什么它们很有用?...世界上, 哪有那么多为什么. Scala正是因为做了类型推导, 让Coders感觉仿佛在写动态语言代码....|Scala|Haskell,ML| |---------|--------| |局部(local)、基于流(flow-based)类型推断|全局化Hindley-Milner类型推断| 在《Programming...in Scala》一书中提到基于流类型推断有它局限性,但是对于面向对象分支类型处理比Hindley-Mlner更加优雅。...基于流类型推导在偏应用函数场景下,不能对参数类型省略 类型推导算法 类型推导(Type Inference)现代高级语言中一个越来越常见特性。其实,这个特性在函数式语言 中早有了广泛应用。

2.5K20

Scala类型推断

对于等效代码,为什么sort1无法使用类型推断,而sortWith可以呢?...类型推断指的是程序语言有自动推断表达式数据类型能力,而无需程序员指定数据类型,简化程序员工作。如下面,可以指定a为Int类型,也可以让Scala推断b为Int类型。...scala> val a:Int = 1 a: Int = 1 scala> val b = 1 b: Int = 1 对于类型推断算法最出名应该是HM算法,大概意思就是先构建一棵包含全部元素解析树...HM算法基于全局类型进行推导,但是Scala有些许不同,因为Scala需要支持面向对象编程,所以它选择了局部基于程序流方式。...对于HM算法,下面的函数成立,但是Scala会报错: scala> def sum(x:Int) = {if (x == 1) 1 else x + sum(x-1)} :7: error

61010

Scala学习笔记之二--基本数据类型

前言 本篇主要讲Scala基本数据类型,更多教程请参考:Scala教程 基本数据类型 Scala一共提供了9中数据类型Scala基本数据类型与java中基本数据类型一一对应,这是Scala...\ \b \\, I an 布尔类型定义: scala>var x = true x:Boolean = true Scala基本类型操作 因为Scala中一切皆对象,这意味着Scala一切操作都是对象方法...分之类型都是Int 2、假如上面的类型不一样,比如: val x = if(x > 0) "positive" else -1 此时这两个类型就不一样了,其中一个分之Int,而另一个分之...此时这个表达式类型公共超类型Any。...x > 0) 1 else ()4、赋值语句Unit类型,所以 x = y = 1 //这样 2、while使用: def gcbLoop(x:Long, y:Long):Long

80050

Scala教程之:静态类型

文章目录 泛类型 型变 协变 逆变 不变 类型上界 类型下界 内部类 抽象类型 复合类型类型 隐式参数 隐式转换 多态方法 类型推断 Scala静态类型,它拥有一个强大类型系统,静态地强制以安全...因为方法 prepend 中参数 elem 协变 B 类型。 在scala中函数参数类型逆变,而返回类型协变。...在这个例子中,”La” 一个 String,因此编译器知道 A 必须 String。 类型推断 Scala 编译器通常可以推断出表达式类型,因此你不必显式地声明它。...你也可以省略方法返回类型: def squareOf(x: Int) = x * x Scala 编译器可以推断出方法返回类型为 Int,因此不需要明确地声明返回类型。...def id[T](x: T) = x val q = id(1) // type: Int Scala 编译器使用传给 MyPair 参数类型推断出 A 和 B 类型

1.3K20

Scala 高级类型

高级类型 1. 视界(“类型类”) 有时候,你并不需要指定一个类型等//超于另一个类,你可以通过转换这个类来伪装这种关联关系。一个视界指定一个类型可以被“看作”另一个类型。...这对对象只读操作很有用。 隐函数允许类型自动转换。更确切地说,在隐式函数可以帮助满足类型推断时,它们允许按需函数应用。...您可以使用<%指定类型限制,例如: scala> class Container[A <% Int] { def addIt(x: A) = 123 + x } defined class Container...可是 Scala 数字类型并不都共享一个超类,所以我们不能使用T <: Number。相反,要使之能工作,Scala math 库对适当类型 T 定义了一个隐含 Numeric[T]。...这时可以使用以下类型-关系运算符: A =:= B A 必须和 B 相等 A <:< B A 必须 B 子类 A <%< B A 必须可以被看做 B scala> class Container

7510

2021年大数据常用语言Scala(十):基础语法学习 方法

---- 方法 一个类可以有自己方法,scala方法和Java方法类似。但scala与Java定义方法语法不一样。...NOTE] 参数列表参数类型不能省略(因为之前定义变量时候可以省略, 这里不要混淆了,因为变量给了初始值,可以根据初始值推断类型) 返回值类型可以省略,由scala编译器自动推断 返回值可以不写return...,默认就是{}块表达式值 示例 定义一个方法,实现两个整形数值相加,返回相加后结果 调用该方法 参考代码 scala> def add(a:Int, b:Int) = a + b m1: (x: Int..., y: Int)Int scala> add(1,2) res10: Int = 3 返回值类型推断 scala定义方法可以省略返回值,由scala自动推断返回值类型。...DANGER] 定义递归方法,不能省略返回值类型 因为, 递归调用是一层一层向内走, 当前那一层无法推断返回类型, 会导致一系列问题.

25220

大数据--scala学习第一章:基础第二章:控制结构和函数第三章:数组第四章:字典和元组第五章:类第六章:对象第七章:包和引入第八章:继承第九章文件和正则表达式第十章特质:接口第十一章操作符第十二章函

4、赋值:赋值语句返回类型Unit如:x=1Unit,所以不能x=y=1这样进行赋值,除非xUnit类型。在使用x={}进行赋值时也要注意最后一个表达式是否为赋值语句。...2、Scala中包作用域更加前后一致,包可以直接使用父包中内容。 3、Scala中引入了包对象,包对象中可以定义方法,属性。...5、参数推断,当你将一个匿名函数传递给函数或方法时,Scala会尽可能推断类型信息如:valueAtOneQuater((x)=>3*x)函数会推断x类型为Double。...3、Scala中你也可以对表达式类型进行匹配,如:但是不能匹配特定泛型,如特定Map类型 obj match { case x:Int=>x //其中x为变量,只能匹配整数并将obj赋值给...7、偏函数:被包在花括号没一组case一个偏函数,一个并非对所有输入都有定义函数,偏函数PartialFunction[A,B]一个实例,其中A为输入,B为返回类型

4.4K20

01.Scala:开发环境搭建、变量、判断、循环、函数、集合

实例{% em %}null{% endem %}可以将null赋值给任何对象类型 Nothing 所有类型子类不能直接创建该类型实例,某个方法抛出异常时,返回就是Nothing类型,因为Nothing...val b:Int = null scala会解释报错: Null类型不能转换为Int类型,说明Null类型并不是Int类型子类 7....NOTE] 参数列表参数类型不能省略 返回值类型可以省略,由scala编译器自动推断 返回值可以不写return,默认就是{}块表达式值 示例 定义一个方法,实现两个整形数值相加,返回相加后结果...= 3 9.2 返回值类型推断 scala定义方法可以省略返回值,由scala自动推断返回值类型。...因为使用foreach去迭代列表,而列表中每个元素类型确定 scala可以自动来推断出来集合中每个元素参数类型 创建函数时,可以省略其参数列表类型 示例 有一个列表,包含以下元素1,2,3,4

4.1K20

Scala编程基础01

二.为什么要学Scala 1.优雅:这是框架设计师第一个要考虑问题,框架用户应用开发程序员,API是否优雅直接影响用户体验。...    //Scala编译器会自动推断变量类型,必要时候可以指定类型     //变量名在前,类型在后     val str: String = "itcast" 2.常用类型 Scala和Java...只是有 一点特别的:这些操作符实际上方法。例如: a + b 如下方法调用简写: a....+(b) a 方法 b可以写成 a.方法(b) 7.定义方法和函数 7.1定义方法 方法返回值类型可以不写,编译器可以自动推断出来,但是对于递归函数,必须指定返回类型 def m1(x:Int,y:Int...在函数式编程语言中,函数“头等公民”,它可以像任何其他数据类型一样被传递和操作  //定义一个方法   //方法m2参数要求是一个函数,函数参数必须两个Int类型   //返回值类型也是Int类型

11810

Scala 学习笔记之基础语法

备注 不需要给出值或者变量类型,可以从你用来初始化它表达式推断出来.只声明值或者变量但不做初始化会报错: scala> val str: String :11: error: only...常用类型 常用类型: Byte Char Short Int Long Float Double Boolean 跟Java不同,这些类型类.Scala并不刻意区分基本类型和引用类型.你可以对数字执行方法...备注 Scala中每个表达式都有一个类型 scala> val s = if(x > 0) "positive" else -1; s: Any = positive 上述表达式类型两个分支类型公共超类型....Scala编译器可以通过=符号右侧表达式类型推断出返回类型....Nothing.这在if/else表达式中很有用.如果一个分支类型Nothing,那么 if/else 表达式类型就是另一个分支类型: if (x > 0) { sqrt(x) } else

52510

SparkSql优化器-Catalyst

二,语法树 Catalyst 主要数据类型就是有节点对象组成树。每个node都有一个node类型和零个或者多个子节点。Scala中新定义node类型TreeNode类子类。...每个批次后,开发人员还可以在新树上进行合理检查(例如,看看是否所有属性都是分配类型了),通常也通过递归匹配来编写。 最后,规则条件及其本身可以包含任意Scala代码。...,以便给它们一个唯一ID(稍后允许对表达式进行优化(如 col = col) 4),在expressions中传播和强制类型:例如,我们不能知道1 + col返回类型,直到我们解析col并且可能将其子表达式转换为兼容类型...(left)} + ${compile(right)}" } 以q开头字符串quasiquote,这意味着尽管它们看起来像字符串,但它们在编译时由Scala编译器解析,代表了代码AST。...此外,它们高度可组合,因为每个节点代码生成规则不需要知道如何构建其节点返回树。最后,Scala编译器进一步优化了最终代码,以防止Catalyst错过了表达式优化。

2.6K90

Scalaz(21)-类型例证:Liskov and Leibniz - type evidence

既然与标准scala<:<和=:=相对应,那么我们可以先了解一下<:<和=:=用法: A =:= B 意思A必须B类型,如:A =:= Int 意思A必须Int类型。...而A <:< B 意思A必须B子类,或者说是我们可以在任何时候用A来替代B。那么既然已经知道了A类型为什么还需要再框定它呢?...先不用理会这些类型参数限定,很乱,总之绕来绕去就是A和B在一个类型区域内。值得注意apply,和subst这个抽象函数:输入参数F[A]返回结果F[B]。...我们可以看到在 A <~< B 实例类型转换函数subst中输入参数F[B]直接替代返回结果F[A],因为F[]逆变(contravariant)而AB子类。也就是我们可以用A替代B。...上面的分析好像很神奇,但我们隐约可以感受到scala类型系统强大推断能力。通过提供一些类型实例,它为我们产生了许多源代码。

45660

两天了解scala

第三节 Array、List Array和List操作,也是普通得一批 第四节 Set、Map、Tuple、队列 有两种,一种可变集合另一种不可变集合;可变集合可以随便玩,不可变集合创建了就不能动了...) Tuple这样 //当然里面可以有不同类型元素 scala> ("hello","china","beijing") 还有队列和栈 scala> var queue=scala.collection.immutable.Queue...)=>x+1}.mkString(",") //省略.方式(写法4) scala> Array(1,2,3,4) map{(x:Int)=>x+1} mkString(",") //参数类型推断写法...//val fun0=1+_,该定义方式不合法,因为无法进行类型推断 scala> val fun0=1+_ //值函数简化方式(正确方式) scala> val fun1=1+(_:Double...另外又讲了self type trait X{ } class B{ //self:X => 要求B在实例化时或定义B子类时 //必须混入指定X类型,这个X类型也可以指定为当前类型 self

60590

Scala函数

2)大部分时候scala都可以通过=符号来自动推断出返回值类型,所以通常返回值类型声明可以省略。     但是注意:如果因为省略了返回值类型造成歧义,则一定要写上返回值声明。     ...使用_占位符前提要求:每个参数在函数仅出现一次。     使用下划线时,如果类型可以自动推断出,则不用声明类型。如果无法自动推断类型,则在下划线后自己来显示声明类型即可。...1.成员函数     成员函数:函数被使用在类内部,作为类一份,称为类成员函数。     ...对象不能直接调用本地函数。...按照指定原则做分组,返回Map类型。Mapkey分组键,value对应List集合。

1.3K40

Scala第二章节

Scala变量 3.1 概述 3.2 语法格式 3.3 示例 3.4 val和var变量区别 3.5 使用类型推断来定义变量 4....如果多行代码写在一行, 则中间分号不能省略, 最后一条代码分号可省略不写. 示例: println("Hello, Scala!")...NOTE] scala中所有的类型都使用大写字母开头 整形使用Int而不是Integer scala中定义变量可以不写类型,让scala编译器自动推断 Scala中默认整型Int, 默认浮点型...它实例{% em %}null{% endem %} 可以将null赋值给任何对象类型 Nothing 所有类型子类, 不能直接创建该类型实例,某个方法抛出异常时,返回就是Nothing类型,因为...val b:Int = null Scala会解释报错: Null类型不能转换为Int类型,说明Null类型并不是Int类型子类 7.

52020

Scala学习一

一、scala方法 1.Scala中方法格式 def 方法名(参数名:参数类型,参数名:参数类型):[return type]={//方法体} 省略条件: 1.参数列表参数类型不能省略 2.参数值类型可以省略...,由scala编译器自动推断 3.返回值可以不写return,默认就是{}块表达式值 4.定义递归方法,不能省略返回值类型 如:获取最大值 //定义方法 def getMaxNum(a:Int, b:...类似java中延迟加载。同时lazy不能修饰var类型变量。...打印结果 printIn("result: "+ result) //50 Scala方法与函数: 方法属于类或者对象,在运行时,它是加载到JVM方法区中,而函数则是加载到JVM堆内存中,同时可以将函数对象赋值给一个变量...函数一个对象,继承自FunctionN,函数对象有apply、curried、toSting、tupled这些方法,而方法则没有。这是scala与java不同地方。

38721

Scala第五章节

Java方法类似, 但scala与Java定义方法语法不一样。...1.2 语法格式 def 方法名(参数名:参数类型, 参数名:参数类型) : [return type] = { //方法体 } 注意: 参数列表参数类型不能省略 返回值类型可以省略,由...打印结果. println("max: " + max) 1.4 返回值类型推断 scala定义方法可以省略返回值数据类型,由scala自动推断返回值类型。这样方法定义后更加简洁。...注意: Java中并没有提供原生态"惰性"技术, 但是可以通过特定代码结构实现, 这种结构被称之为: 懒加载(也叫延迟加载) lazy不能修饰var类型变量....调用方法 sayHello 注意: 在Scala中, 如果方法返回值类型Unit类型, 这样方法称之为过程(procedure) 过程等号(=)可以省略不写.

70120

2021年大数据常用语言Scala(四):基础语法学习 声明变量

语法格式 Java变量定义 int a = 0; 在scala中,可以使用val或者var来定义变量,语法格式如下: val/var 变量标识:变量类型 = 初始值 其中 val定义不可重新赋值变量...var定义可重新赋值变量 [!...NOTE] scala中定义变量类型写在变量名后面 scala语句最后不需要添加分号 在解释器中定义一个变量 示例:定义一个变量保存一个人名字"tom" 步骤 打开scala解释器 定义一个字符串类型变量用来保存名字...TIP] 优先使用val定义变量,如果变量需要被重新赋值,才使用var 使用类型推断来定义变量 Scala语法要比Java简洁,我们可以使用一种更简洁方式来定义变量。...示例 使用更简洁语法定义一个变量保存一个人名字"tom" 参考代码 scala> val name = "tom" name: String = tom Scala可以自动根据变量值来自动推断变量类型

34820
领券