【问题标题】:Scala - "pattern matching results in loosened type guarantees"?Scala - “模式匹配导致松散的类型保证”?
【发布时间】:2017-03-07 05:57:33
【问题描述】:

来自 Eugene Burmako 的 a paper

在 Akka,一个 [...],actor 通常使用无类型的 tell 方法进行交互。由于参与者能够相互发送任意类型的消息,因此类型信息会在接收方丢失,并且通常只能使用模式匹配、放松类型保证来恢复。

他在这里指的是什么保证,为什么模式匹配会削弱它们?

【问题讨论】:

    标签: scala pattern-matching type-inference


    【解决方案1】:

    这是一个简单的 akka 示例(来自:here

    import akka.actor._
    
    class HelloActor(myName: String) extends Actor {
      def receive = {
        case "hello" => println("hello from %s".format(myName))
        case _       => println("'huh?', said %s".format(myName))
      }
    }
    
    object Main extends App {
      val system = ActorSystem("HelloSystem")
      val helloActor = system.actorOf(Props(new HelloActor("Fred")), name ="helloactor")
      helloActor ! "hello"
      helloActor ! "buenos dias"
    }
    

    HelloActor 中的接收函数采用 Any 类型。 (从技术上讲,它是从 Any 到 Unit 的部分函数)。这意味着要了解它的类型,我们需要进行模式匹配。我可以向 HelloActor 发送一个 Int 并且编译器不会阻止我。如果我只是有一个接受字符串的普通函数,那么编译器会检测到它。我相信这句话所指的是缺乏类型安全。

    有类型化的 akka 演员,但我从未使用过它们,也不确定它们的含义。

    【讨论】:

      【解决方案2】:

      A Spoty Spot 的答案告诉您丢失了哪些保证,但“为什么模式匹配会削弱它们”的答案是它没有。你稍微误读了句子。而不是

      模式匹配,放松类型保证

      读作

      类型信息在接收方丢失,并且通常只能使用模式匹配来恢复,放松类型保证

      “并且通常只能恢复...”是parenthetical

      【讨论】:

        猜你喜欢
        • 2020-08-09
        • 2013-03-17
        • 2014-03-05
        • 1970-01-01
        • 2019-04-20
        • 2013-12-01
        • 2018-01-03
        • 1970-01-01
        相关资源
        最近更新 更多