1

今日、scalaz のシーケンス関数について言及しているブログ記事を見つけました。

次のような簡単なことはできませんでした:

if (l contains None) None else l

もしそうなら、この関数シグネチャはどのように見えるでしょうか? containsは SeqLike ですよね?

また、ブログ投稿から、シーケンスは map に似たものになると思いましたが、 None に遭遇すると壊れます。このようなものはありますか?

4

2 に答える 2

2

はい、できますが、次のようにする必要があります。

if (l contains None) None else Some(l.map(_.get))

ブログ投稿のコードは、(scalazの抽象化を使用して)可能な限り一般的な関数を記述しようとしているため、Seqのオプションだけでなく機能します。

[編集]修正

于 2010-10-03T19:33:36.807 に答える
1

はい、特定のデータ構造に特化したシーケンス関数を確実に作成できます。ただし、Scalaz バージョンは可能な限り一般的です。したがって、可能なFとの任意の組み合わせで機能GF[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)

于 2010-10-05T18:11:04.420 に答える