سؤال

لديّ مجموعة أرغب في تعيينها إلى مجموعة جديدة ، ولكن كل قيمة ناتجة تعتمد على القيمة قبل ذلك بطريقة ما.

val result:List[B] = (myList:List[A]).foldLeft(C -> List.empty[B]){ 
  case ((c, list), a) =>
    ..some function returning something like..
    C -> (B :: list)
} 

المشكلة هنا هي أنني بحاجة إلى التكرار من خلال القائمة بأكملها لاسترداد القائمة الناتجة. لنفترض أنني أردت وظيفة تقوم بتعيين TraversableOnce [A] إلى TraversableOnce [B] وتقييم الأعضاء فقط كما أسميهم؟ يبدو لي أن أكون مشكلة تقليدية إلى حد ما ، لذا فأنا أتساءل عما إذا كان هناك مقاربة شائعة لهذا. ما لدي حاليا هو:

implicit class TraversableOnceEx[T](val self : TraversableOnce[T]) extends AnyVal {

   def foldyMappyFunction[A, U](a:A)(func:(A,T) => (A,U)):TraversableOnce[U] = {
     var currentA = a
     self.map { t =>
        val result = func(currentA, t)
        currentA = result._1
        result._2
     }
   } 
}

بقدر ما يذهب النقاء الوظيفي ، لا يمكنك تشغيله بالتوازي ، ولكن خلاف ذلك يبدو الصوت.

مثال سيكون ؛ أعد لي كل عنصر وإذا كانت المرة الأولى التي يظهر فيها هذا العنصر من قبل.

val elements:TraversableOnce[E]
val result = elements.mappyFoldyFunction(Set.empty[E]) {
 (s, e) => (s + e) -> (e -> s.contains(e))
}
result:TraversableOnce[(E,Boolean)]
هل كانت مفيدة؟

المحلول

قد تكون قادرًا على الاستفادة من موناد الدولة. هنا مثالك إعادة كتابة باستخدام Scalaz:

import scalaz._, Scalaz._

def foldyMappy(i: Int) = State[Set[Int], (Int, Boolean)](s => (s + i, (i, s contains(i))))

val r = List(1, 2, 3, 3, 6).traverseS(foldyMappy)(Set.empty[Int])._2

//List((1,false), (2,false), (3,false), (3,true), (6,false))
println(r)

نصائح أخرى

يبدو أنك بحاجة Seqview. يستخدم view أو view(from: Int, until: Int) طرق إنشاء عرض غير متخلف للقائمة.

أنا حقًا لا أفهم مثالك لأن يحتويك على التحقق دائمًا إلى false.

foldLeft مختلف. سيؤدي ذلك إلى قيمة واحدة عن طريق تجميع جميع عناصر القائمة. من الواضح أنك بحاجة map (List => List).

على أي حال ، الإجابة على سؤالك حول الكسل: يجب أن تستخدم Stream بدلاً من List. Stream لا تقيم الذيل قبل أن يطلق عليه بالفعل.

دفق API

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top