Dynamic 在Haskell中动态构建列表理解
我很好奇是否可以在Haskell中动态构建列表理解 例如,如果我有以下内容:Dynamic 在Haskell中动态构建列表理解,dynamic,haskell,list-comprehension,Dynamic,Haskell,List Comprehension,我很好奇是否可以在Haskell中动态构建列表理解 例如,如果我有以下内容: all_pows (a,a') (b,b') = [ a^y * b^z | y <- take a' [0..], z <- take b' [0..] ] 然而,我真正想要的是 all_pows [(Int,Int)] -> [Integer] 这样我就可以支持N对参数,而无需构建N版本的all\u-pows。我对Haskell还是个新手,所以我可能忽略了一些显而易见的事情。这可能吗?单子列表
all_pows (a,a') (b,b') = [ a^y * b^z | y <- take a' [0..], z <- take b' [0..] ]
然而,我真正想要的是
all_pows [(Int,Int)] -> [Integer]
这样我就可以支持
N
对参数,而无需构建N
版本的all\u-pows
。我对Haskell还是个新手,所以我可能忽略了一些显而易见的事情。这可能吗?单子列表的魔力:
ghci> let powers (a, b) = [a ^ n | n <- [0 .. b-1]]
ghci> powers (2, 3)
[1,2,4]
ghci> map powers [(2, 3), (5, 3)]
[[1,2,4],[1,5,25]]
ghci> sequence it
[[1,1],[1,5],[1,25],[2,1],[2,5],[2,25],[4,1],[4,5],[4,25]]
ghci> mapM powers [(2, 3), (5, 3)]
[[1,1],[1,5],[1,25],[2,1],[2,5],[2,25],[4,1],[4,5],[4,25]]
ghci> map product it
[1,5,25,2,10,50,4,20,100]
ghci> let allPowers list = map product $ mapM powers list
ghci> allPowers [(2, 3), (5, 3)]
[1,5,25,2,10,50,4,20,100]
或者使用折叠
import Data.List
product list = foldl' (*) 1 list
但实际上,它已经被定义了!我喜欢这种语言☺☺☺
让powers(a,b)=[a^n | n@Tordek谢谢,我略过了原文有点太快了。
cartesianProduct :: [[a]] -> [[a]]
cartesianProduct [] = [[]]
cartesianProduct (list:lists)
= [ (x:xs) | x <- list, xs <- cartesianProduct lists ]
product list = product' 1 list
where product' accum [] = accum
product' accum (x:xs)
= let accum' = accum * x
in accum' `seq` product' accum' xs
import Data.List
product list = foldl' (*) 1 list