سؤال

إذا كان لدي شيء مثل أ List[Option[A]] وأريد تحويل هذا إلى List[A], ، الطريقة القياسية هي الاستخدام flatMap:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

الآن o => o هي مجرد وظيفة الهوية. كنت أعتقد أنه سيكون هناك طريقة للقيام بذلك:

l.flatMap(Identity) //return a List[String]

ومع ذلك ، لا يمكنني جعل هذا العمل لأنه لا يمكنك مولد object. جربت بعض الأشياء دون جدوى ؛ هل حصل أي شخص على شيء مثل هذا للعمل؟

هل كانت مفيدة؟

المحلول

هناك هوية وظيفة في السابق.

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

A for Expresion أجمل ، أفترض:

for(x <- l; y <- x) yield y

تعديل:

حاولت معرفة سبب حاجة إلى معلمة النوع (الخيار [سلسلة]). يبدو أن المشكلة هي تحويل النوع من الخيار [t] إلى itable [t].

إذا حددت وظيفة الهوية على النحو التالي:

l.flatMap( x => Option.option2Iterable(identity(x)))

يمكن حذف المعلمة النوع.

نصائح أخرى

FWIW ، على Scala 2.8 يمكنك الاتصال فقط flatten عليه. توماس هل غطى في الغالب ل Scala 2.7. لقد فاته طريقة بديلة واحدة فقط لاستخدام تلك الهوية:

l.flatMap[String](identity)

ومع ذلك ، لن يعمل مع تدوين المشغل ، (يبدو أن تدوين المشغل لا يقبل معلمات النوع ، وهو أمر جيد معرفته).

تستطيع ايضا يتصل flatten على Scala 2.7 (على أ List, ، على الأقل) ، لكنه لن يكون قادرًا على فعل أي شيء بدون نوع. ومع ذلك ، هذا يعمل:

l.flatten[String]

يمكنك فقط إعطاء نوع الاستدلال القليل من المساعدة:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top