Haskell - 如果在列表推导中使用其他方法怎么用?

时间:2018-05-25 01:55:48

标签: haskell

我希望从滚动两个骰子中生成一个点列表。如果两个骰子显示相同的值,则输出点将变为(i,i,i,i)

我的代码就像

[(i,j)|i<-[1..6],j<-[1..6], if i==j
                            then (i,i,i,i)
                            else (i,j)]

当我把它输入GHCi时,它无法编译。

我期望的输出是

[(1,1,1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,1),(2,2,2,2),(2,3),(2,4),(2,5),(2,6),(3,1),(3,2),(3,3,3,3),(3,4),(3,5),(3,6),(4,1),(4,2),(4,3),(4,4,4,4),(4,5),(4,6),(5,1),(5,2),(5,3),(5,4),(5,5,5,5),(5,6),(6,1),(6,2),(6,3),(6,4),(6,5),(6,6,6,6)]

1 个答案:

答案 0 :(得分:6)

list元素应该是相同的类型,你的4元组和2元组不是。 如果切换到列表而不是像这样写

[if i==j then [i,i,i,i] else [i,j] | i<-[1..6], j<-[1..6]]

将生成

[[1,1,1,1],[1,2],[1,3],[1,4],[1,5],[1,6],
 [2,1],[2,2,2,2],[2,3],[2,4],[2,5],[2,6],
 [3,1],[3,2],[3,3,3,3],[3,4],[3,5],[3,6],
 [4,1],[4,2],[4,3],[4,4,4,4],[4,5],[4,6],
 [5,1],[5,2],[5,3],[5,4],[5,5,5,5],[5,6],
 [6,1],[6,2],[6,3],[6,4],[6,5],[6,6,6,6]]