【发布时间】:2020-12-10 11:53:41
【问题描述】:
我是 Haskell 的新手,我有数据 data Instruction = Add | Sub | Mul | Div | Dup | Pop deriving (Eq,Ord,Show,Generic),我正在生成列表,其中包含 Mul 和 Dup 的所有可能组合以及大小为 n 的 mapM (const [Mul, Dup]) [1..n])。
我只想要以Dup 开头并以Mul 结尾的列表,所以我使用了filter((== Mul) . last)(filter((== Dup) . head) (mapM (const [Mul, Dup]) [1..n])),但我也只想要其中具有相同数量的Mul 和Dup 的列表,但我不能t 似乎想出一种方法来做到这一点。我该如何过滤?有没有更有效的方法来做这件事,因为随着列表变大,可能会有大量的组合?
示例列表如下所示:[Dup,Mul,Dup,Mul] 和 [Dup,Dup,Mul,Mul] 用于大小为 4 的列表。
【问题讨论】:
-
我必须说,我真的很喜欢
mapM (const [Mul, Dup]) [1..n]的做法——这是一种非常优雅的生成这些列表的方式,而且我自己也找不到!也许sequenceA (replicate 3 [Mul, Dup])可能更容易阅读,但我当然喜欢你的做法。 -
@bradrn
replicateM 3 [Mul, Dup]也可以工作。尽管如此,与其生成所有列表然后过滤掉错误的列表,不如一开始只生成想要的列表会更快。 -
谢谢@chi,不知怎的我完全忘记了
replicateM!这确实是一种更好的方法。