代码之家  ›  专栏  ›  技术社区  ›  Teja Kantamneni

Scala对haskell last方法的实现

  •  3
  • Teja Kantamneni  · 技术社区  · 16 年前

    我正在尝试用scala编写一些示例程序,以便更熟悉该语言,因为我正在尝试在Haskell中重新实现一些内置方法,我确信这些方法中的大多数也在scala中实现,但这些只是为了我的实践。我想我可以发布一些代码片段(不是全部),以获得更好的工作方式,并验证我对scala的理解。如果这里不是做这些事情的地方,请告诉我。

    Any 我是否丢失了列表中包含的对象的类型?这就是在scala中实现这类事情的方式吗?

      def getLast(xs: List[Any]): Any = xs match {
         case List()         => null
         case x :: List()    => x
         case _ :: ys        => getLast(ys) 
       }
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   Mitch Blevins    16 年前

    参数化函数的类型并使用“Nil”而不是List(),如下所示:

      def getLast[T](xs: List[T]): T = xs match {
         case Nil         => null.asInstanceOf[T]
         case x :: Nil    => x
         case _ :: ys     => getLast(ys) 
       }
    

    此外,考虑使其返回选项类型:

      def getLast[T](xs: List[T]): Option[T] = xs match {
         case Nil         => None
         case x :: Nil    => Some(x)
         case _ :: ys     => getLast(ys) 
       }
    

    用法:

      val listOfInts = List(1,2,3)
      assert(getLast(listOfInts).isInstanceOf[Int])
    
      val listOfStrings = List("one","two","three")
      assert(getLast(listOfStrings).isInstanceOf[String])
    
        2
  •  5
  •   retronym    16 年前

    首先,避免这种情况 null ,尤其是 null.asInstanceOf[T] . 用原语观察危险:

    scala> null.asInstanceOf[Int]
    res19: Int = 0
    
    scala> null.asInstanceOf[Boolean]
    res20: Boolean = false
    

    List[T] => T 由此 last 在空迭代器上,会引发异常:

    def last[T](ts: List[T]): T = ts match {       
        case Nil => throw new NoSuchElementException
        case t :: Nil => t                          
        case t :: ts => last(ts)                    
    }   
    

    或者: List[T] => Option[T]

    def lastOption[T](ts: List[T]): Option[T] = ts match {
        case Nil => None                                   
        case t :: Nil => Some(t)                           
        case t :: ts => lastOption(ts)                     
    }
    
    def lastOption1[T](ts: List[T]): Option[T] = ts.reverse.headOption
    
    def lastOptionInScala28[T](ts: List[T]): Option[T] = ts.lastOption  // :)
    
    推荐文章