私は現在、次のような関数を扱っています。
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
つまり、リストが与えられた場合、最初の6つの要素を何かに使用し、リストが6要素未満の場合def
は、欠落している要素の代わりとして使用します。これは合計ですが、その一部は(のようにmap fromJust . filter isJust
)異なるため、私は好きではありません。私はこれを書き直して、偏りを使用する必要がないようにして、これを得ました:
foo [] = foobar def def def def def def
foo [a] = foobar a def def def def def
foo [a,b] = foobar a b def def def def
foo [a,b,c] = foobar a b c def def def
foo [a,b,c,d] = foobar a b c d def def
foo [a,b,c,d,e] = foobar a b c d e def
foo (a:b:c:d:e:f:_) = foobar a b c d e f
技術的には自分のやりたいことをやっていましたが、今ではこれは巨大な混乱です。よりエレガントで繰り返しの少ない方法でこれを行うにはどうすればよいですか?
@chi私はそれで行くだろうと思います。答えてくれれば受け入れます。
—
ジョセフ・サイブル復職モニカ
それだけの価値があるので、の全体論
—
Daniel Wagner、
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...
は十分にローカルであり、それを使用して、既存の回答で導入されているすべての追加の機構をスキップすることについて二度と考えないでしょう。一般に、私を緊張させるのは、よりグローバルな全体論の引数(たとえば、複数の関数呼び出しにわたって維持される不変式を含む)です。
takeWithDef
正規のリストを返す場合、実際には使用できません。パターンマッチする必要があるためです。-//適切な解決策は、ダニエルが2番目の回答で以下に書いたものです。uncons
最初の要素のみを取得するので、それほど役に立ちません。
uncons :: Default a => [a] -> (a,[a])
デフォルトのを書いてくださいdef
。またはデフォルトtakeWithDef
。および/またはビューパターン/パターンの同義語。ただし、これには補助ヘルパーコードの記述が必要です。