今日、scalaz のシーケンス関数について言及しているブログ記事を見つけました。
次のような簡単なことはできませんでした:
if (l contains None) None else l
もしそうなら、この関数シグネチャはどのように見えるでしょうか? containsは SeqLike ですよね?
また、ブログ投稿から、シーケンスは map に似たものになると思いましたが、 None に遭遇すると壊れます。このようなものはありますか?
はい、できますが、次のようにする必要があります。
if (l contains None) None else Some(l.map(_.get))
ブログ投稿のコードは、(scalazの抽象化を使用して)可能な限り一般的な関数を記述しようとしているため、Seqのオプションだけでなく機能します。
[編集]修正
はい、特定のデータ構造に特化したシーケンス関数を確実に作成できます。ただし、Scalaz バージョンは可能な限り一般的です。したがって、可能なF
との任意の組み合わせで機能G
しF[G[A]] => G[F[A]]
ます。
あなたが探している他の関数は呼び出されtraverse
ます。サイン入りです
def traverse[F[_]:Traverse,G[_]:Applicative,A,B](m: F[A], f: A => G[B]): G[F[B]]
x.traverse(f)
と同等x.map(f).sequence
です。
x.sequence
と同等ですx.traverse(a => a)