هل هناك وظيفة هوية سكالا؟
-
22-09-2019 - |
سؤال
إذا كان لدي شيء مثل أ 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)