假设我想知道(x, y)
平面上has
矩形中的所有点。
我可以通过这种方式使用List Comprehensions来计算:
let myFun2D = [(x, y) | x <- [0..2], y <- [0..2]]
现在,如果我想在(x, y, z)
空间中完成同样的工作,我可以采用相同的方式做到:
let myFun3D = [(x, y, z) | x <- [0..2], y <- [0..2], z <- [0..2]]
有没有办法可以针对任意数量的维度进行概括?如果是,怎么样?
let myFunGeneralized = ?
由于
答案 0 :(得分:11)
不幸的是,由于[(a,a)]
和[(a,a,a)]
等类型不同,因此您无法编写一个函数来表示所有类型。
无论如何,一般来说你可以使用
Prelude> let x = [0..2]
Prelude> import Control.Applicative
Prelude Control.Applicative> (,,) <$> x <*> x <*> x
[(0,0,0),(0,0,1),(0,0,2),(0,1,0),(0,1,1),(0,1,2),(0,2,0),(0,2,1),(0,2,2),(1,0,0),(1,0,1),(1,0,2),(1,1,0),(1,1,1),(1,1,2),(1,2,0),(1,2,1),(1,2,2),(2,0,0),(2,0,1),(2,0,2),(2,1,0),(2,1,1),(2,1,2),(2,2,0),(2,2,1),(2,2,2)]
如果你想要一个[[a]]
,那么有一个非常简单的功能:
Prelude> sequence (replicate 3 x)
[[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2],[0,2,0],[0,2,1],[0,2,2],[1,0,0],[1,0,1],[1,0,2],[1,1,0],[1,1,1],[1,1,2],[1,2,0],[1,2,1],[1,2,2],[2,0,0],[2,0,1],[2,0,2],[2,1,0],[2,1,1],[2,1,2],[2,2,0],[2,2,1],[2,2,2]]
或(感谢sdcvvc)
Prelude> import Control.Monad
Prelude Control.Monad> replicateM 3 x
[[0,0,0],[0,0,1],[0,0,2],[0,1,0],[0,1,1],[0,1,2],[0,2,0],[0,2,1],[0,2,2],[1,0,0],[1,0,1],[1,0,2],[1,1,0],[1,1,1],[1,1,2],[1,2,0],[1,2,1],[1,2,2],[2,0,0],[2,0,1],[2,0,2],[2,1,0],[2,1,1],[2,1,2],[2,2,0],[2,2,1],[2,2,2]]
答案 1 :(得分:2)
可以使用Template Haskell来处理元组问题的列表(运行ghci -XTemplateHaskell
):
> import Language.Haskell.TH
> let x = [0..2]
> let tt n l = listE [tupE [[|l!!i|] | i <- [0..(n-1)]] | l <- sequence $ replicate n l ]
> $(tt 2 x)
[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
> $(tt 3 x)
[(0,0,0),(0,0,1),(0,0,2),(0,1,0),(0,1,1),(0,1,2),(0,2,0),(0,2,1),(0,2,2),(1,0,0),(1,0,1),(1,0,2),(1,1,0),(1,1,1),(1,1,2),(1,2,0),(1,2,1),(1,2,2),(2,0,0),(2,0,1),(2,0,2),(2,1,0),(2,1,1),(2,1,2),(2,2,0),(2,2,1),(2,2,2)]
答案 2 :(得分:1)
您可以使用以下内容:
myFun :: Integer -> [[Integer]] -- Param: number of dimensions
myFun dim = snd $
until ((== 0) . fst) --recursive build your tuple
(\(d,lst) -> (pred d,[x:l|x <- [0..2],l <- lst]))
(dim,[[]])
这将为您提供一个点列表列表,您可以假设所有这些子列表具有相同的长度。它应该像这样工作:
> myFun 0
[]
> myFun 1
[[0],[1],[2]]
> myFun 2
[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]