专门关联类型内部功能

时间:2015-12-13 12:07:29

标签: scala

我有一个定义相关类型的特征。在函数中,我想返回这个根据提供的值而不同的关联类型:

sealed trait Abstract {
  type T
}

class Impl1 extends Abstract {
  type T = Int
}

class Impl2 extends Abstract {
  type T = Boolean
}

object G {
  def get[A <: Abstract] (x: A): A#T = {
    x match {
      case i1: Impl1 =>
        5
      case i2: Impl2 =>
        true
    }
  }
}

问题是,scala无法识别匹配的情况A#T分别是IntBoolean,我收到以下错误消息:

Expression of type Int doesn't conform to expected type A#T

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您的 $messages = array(); foreach ($errors as $element) { foreach ($element as $element_error) { $messages[] = $element_error; } } $response['messages'] = $messages; $response['status'] = 'error'; return new JsonResponse($response, 200); 条件会给出AnyVal结果,但它对use Illuminate\Http\JsonResponse; 一无所知。您应该对结果或extrac模式匹配使用match

A#T

答案 1 :(得分:1)

  

问题是,scala没有认识到在匹配的情况下A#T分别是Int或布尔值

严格地说,它不是。例如,您可以致电

get[Abstract](new Impl1)

在这种情况下,A#TAbstract#TInt不是Boolean。或

get(throw new Exception) 

所以你得到Nothing#TNothing <: Abstract,毕竟!)。

一般来说,根据我的经验,即使在GADT上,Scala也不是那么好,而且你经常需要做的事情是帮助&#34;通过使用演员阵容,你有责任确保他们的安全。