簡體   English   中英

在Haskell中動態構建列表理解

[英]Dynamically build list comprehension in Haskell

我很好奇是否有可能在Haskell中動態構建列表理解。

舉個例子,如果我有以下內容:

all_pows (a,a') (b,b') = [ a^y * b^z | y <- take a' [0..], z <- take b' [0..] ]

我得到了我想要的東西

*Main> List.sort $ all_pows (2,3) (5,3)
[1,2,4,5,10,20,25,50,100]

但是,我真正喜歡的是擁有類似的東西

all_pows [(Int,Int)] -> [Integer]

因此,我可以支持N對參數,而無需構建N版本的all_pows 我仍然是Haskell的新手,所以我可能忽略了一些顯而易見的事情。 這甚至可能嗎?

列表monad的魔力:

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]

這可能需要更多解釋。

你可以寫自己的

cartesianProduct :: [[a]] -> [[a]]
cartesianProduct [] = [[]]
cartesianProduct (list:lists)
  = [ (x:xs) | x <- list, xs <- cartesianProduct lists ]

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

然而, 理解單子故意相似。 標准Prelude有sequence :: Monad m => [ma] -> m [a] ,當m是列表monad [] ,它實際上完全按照我們上面所寫的那樣做。

作為另一種捷徑, mapM :: Monad m => (a -> mb) -> [a] -> m [b]只是sequencemap的組合。

對於每個基數的不同冪的每個內部列表,您希望將它們乘以一個數字。 你可以遞歸地寫這個

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

但實際上, product :: Num a => [a] -> a已經定義了! 我喜歡這種語言☺☺☺

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM