2017-08-28 77 views
0

是否可以在以下代码段中内联my函数?lambda中的懒惰参数

import scala.annotation.tailrec 


object Ex14AppendViaFold extends App { 
    val l = List[Int](1, 2, 3, 4) 
    val l2 = List[Int](9, 8, 7, 6) 

    def append[A](l1: => List[A], l2: => List[A]) = { 
    def my(acc: => List[A], e: => A) = Cons(e, acc): List[A] 

    List.foldLeft(List.reverse(l1), l2)(my) 
    } 

    println(append(l, l2)) 
} 

sealed trait List[+A] 
case object Nil extends List[Nothing] 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 


object List{ 
    def apply[A](as: A*): List[A] = // Variadic function syntax 
    if (as.isEmpty) Nil 
    else Cons(as.head, apply(as.tail: _*)) 

    def reverse[A](l :List[A]) = 
    List.foldLeft[A, List[A]](l,Nil)((acc, elem) => Cons(elem,acc)) 

    @tailrec 
    def foldLeft[A,B](l: List[A], z: B)(f: (=> B, => A) => B): B = l match { 
     case Cons(h, tail) => foldLeft(tail, f(z, h))(f) 
     case Nil => z 
    } 
} 
+2

你试过了吗? – cchantep

+0

https://stackoverflow.com/questions/28876368/scala-by-name-parameter-on-a-anonymous-function –

+0

亲爱的@StefanK。 ,你对[回答](https://stackoverflow.com/a/45924391/5249621)满意吗?谢谢。 –

回答

1

基于this答案:

List.foldLeft(List.reverse(l1), l2)(
    ((acc, e) => Cons(e, acc)): ((=> List[A], => A) => List[A]) 
) 

所以,你可以指定拉姆达的类型。

+0

尽管此代码片段可能解决问题,并不能解释为什么或如何回答问题。请[请提供您的代码解释](// meta.stackexchange.com/q/114762/269535),因为这确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 **标记/评论者:** [仅用于代码解答,例如这个,downvote,请勿删除!](// meta.stackoverflow.com/a/260413/2747593) – Patrick

+1

@Patrick 感谢您的指导我,我稍微修改了我的答案。 –