5

「ブール値がfalseでない場合」または「リストが空でない場合はそれを使用し、そうでない場合は別のものを使用する」というパターンをプログラムしていることに気付くことがあります。

「たぶん」関数がたぶんあるものであるBoolとListの関数を探しています。いずれかがあります?

更新:リストケースの一般化としてブールケースを使用するつもりでした。たとえば、Data.TextをTとして使用する場合:

if T.null x then x else foo x

私はそのようなボイラープレートコードを減らすことを目指しています。

4

3 に答える 3

7

maybe多分タイプのカタモルフィズムです。

foldrリストタイプのカタモルフィズムです。

Data.Bool.boolブール型のカタモルフィズムです。

あなたが次maybeのように使用した場合:maybe x (const y)

あなたが使用することができます: foldr (const (const y)) x

あなたの例は次のようif T.null x then x else foo xに書くことができますbool

bool foo id (T.null x) x

(最初にケースを取りますFalse、の反対ですif

于 2010-10-14T10:35:17.643 に答える
4

答えはおそらくそのようなジェネリック関数がないということだと思います。djvが言うように、おそらくData.Monoidを基にして、次のようなものを書くことができます。

maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b
maybe' repl f x = if x == mempty then repl else f x

しかし、私はそのような標準ライブラリの関数(またはそうするために簡単に一緒に構成できる関数)を知りません。

于 2010-10-01T11:30:04.450 に答える
3

Data.Monoidを確認してください。これは、指定された空の値を持つデータ型を記述する型クラスであり、その上でパターンマッチングを行って、ジェネリック関数を記述できます。Bool値が空の場合Falseと値が空の場合がありListます[]

于 2010-10-01T09:17:40.573 に答える