我的功能很有趣,我想得到一个这样的输出:
[ ("fluffy", "loves", "bunny"), ("monkey", "feeds", "fluffy"),
("bunny", "feeds", "monkey") ]
目前我的输出是:
[("fluffy","eats","bunny"),("fluffy","eats","monkey"),("fluffy","feeds","bunny")]
我的问题是每次的名字都是一样的,我希望它不同,所以尝试使用索引:(u1 !! n + 1 / = u2) 但是,当我尝试运行它时,这会给我一个错误:
Couldn't match expected type ‘Char’ with actual type ‘[Char]’
In the second argument of ‘(/=)’, namely ‘u2’
In the expression: u1 !! n + 1 /= u2
我的代码:
names = ["fluffy", "bunny", "monkey"]
n= 0
fun = [ (u1, v, u2) | u1 <- names, v <- ["eats", "feeds", "loves"], u2 <- names, u1 /= u2]
funThree = take 3 (cycle fun)
谁能告诉我如何解决这个问题?谢谢
答案 0 :(得分:2)
你有一个可能的句子空间是3乘3乘3,其中9个句子被u1 /= u2
划掉。
eats feeds loves <- v
|fluffy|bunny |monkey| |fluffy|bunny |monkey| |fluffy|bunny |monkey| <- u2
-------|------|------|------| |------|------|------| |------|------|------|
| | | | | | | | | | | |
fluffy | X | | | | X | | | | X | | |
| | | | | | | | | | | |
-------|------|------|------| |------|------|------| |------|------|------|
| | | | | | | | | | | |
bunny | | X | | | | X | | | | X | |
| | | | | | | | | | | |
-------|------|------|------| |------|------|------| |------|------|------|
| | | | | | | | | | | |
monkey | | | X | | | | X | | | | X |
| | | | | | | | | | | |
----------------------------- ---------------------- ----------------------
^u1
您需要决定访问这些内容的顺序。列表推导将第一个源列表视为最外层列表,将最后一个列表视为最内层列表。它们在第二个到最后一个列表中执行一个步骤之前完全遍历最后一个列表,然后在第二个到最后一个列表中执行第二步之前再次完全遍历最后一个列表。在探索后面列表中的所有组合之前,不会在第一个列表中执行步骤。这与从左到右,从上到下阅读上表一样,就像读书一样。
您可以通过更改源列表的顺序来更改列表解析中结果的顺序。源列表有6种可能的订单。
如果这些都没有给你你想要的东西,你需要弄清楚如何描述你想要访问句子空间中的点的顺序,要么告诉编译器要么告诉别人寻求帮助。尝试使用从X
到1
的数字对方框(包括27
ed out)编号,以指定顺序并查找模式。只有18个可能的句子有超过6万亿可能的订单。
答案 1 :(得分:0)
如果从名称列表中生成名称对列表,则会更容易。
namePairs names = zip cnames (drop 1 cnames) -- modify number as desired
where cnames = cycle names
产生对(蓬松,兔子),(兔子,猴子)等
然后你的函数基本上变成了一个zipWith,你可以在其中添加动作。
或者你可以从一开始就使用zip3,结合循环名称的名称,动作和子列表。