我目前正在处理这样的功能:
foo = (\(a:b:c:d:e:f:_) -> foobar a b c d e f) . (++ repeat def)
换句话说,给定一个列表,它将使用前六个元素来表示某项内容;如果列表的长度少于六个元素,则将其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我想这就是我要去的。如果您给出答案,我会接受的。
—
约瑟夫·西布尔-恢复莫妮卡
对于它的价值,我认为for的总体论点
—
Daniel Wagner
case xs ++ repeat def of a:b:c:d:e:f:_ -> ...
足够本地化,以至于我不会再三考虑仅使用它并跳过现有答案引入的所有额外机制。通常,更全局的总体参数(例如,涉及多个函数调用之间保持不变的变量)使我感到紧张。
takeWithDef
如果它返回常规列表,则实际上是不可用的,因为我们需要对以下内容进行模式匹配:-//正确的解决方案是丹尼尔在第二个回答中写的内容。uncons
仅获取第一个元素,因此它没有太大用处。
uncons :: Default a => [a] -> (a,[a])
默认为的def
。或默认设置takeWithDef
。和/或视图模式/模式的同义词。不过,这需要编写一些辅助帮助程序代码。