Haskell 泛化问题(涉及列表理解)

2024-05-14

假设我想知道a上的所有要点(x, y)矩形内的平面has.

我可以使用列表推导式来计算,如下所示:

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 = ?

Thanks


不幸的是,因为[(a,a)] and [(a,a,a)]etc 属于不同类型,您无法编写一个函数来代表所有类型。

无论如何,一般来说你可以使用

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]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell 泛化问题(涉及列表理解) 的相关文章

随机推荐