n計算串列與自身時間的笛卡爾積的簡單方法是什么?
也就是說,我該如何定義函式cartesianExp :: Int -> [a] -> [[a]]。
例如,[1,2]與自身 3 次 ( n = 3) 的笛卡爾積應該是:
[
[1, 1, 1],
[1, 1, 2],
[1, 2, 1],
[1, 2, 2],
[2, 1, 1],
[2, 1, 2],
[2, 2, 1],
[2, 2, 2]
]
uj5u.com熱心網友回復:
你可以合作replicateM :: Applicative f => Int -> f a -> f [a]來做到這一點。確實:
ghci> import Control.Monad(replicateM)
ghci> replicateM 0 "abc"
[""]
ghci> replicateM 1 "abc"
["a","b","c"]
ghci> replicateM 2 "abc"
["aa","ab","ac","ba","bb","bc","ca","cb","cc"]
ghci> replicateM 3 "abc"
["aaa","aab","aac","aba","abb","abc","aca","acb","acc","baa","bab","bac","bba","bbb","bbc","bca","bcb","bcc","caa","cab","cac","cba","cbb","cbc","cca","ccb","ccc"]
ghci> replicateM 3 [1,2]
[[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]]
uj5u.com熱心網友回復:
import Data.List
cartesianExp :: Int -> [a] -> [[a]]
cartesianExp 0 _ = [[]]
cartesianExp n xs = [x:tup | x <- xs, tup <- cartesianExp (n - 1) xs]
按照慣例,集合S與自身 0 次的笛卡爾積S 0是由單個空元組組成的集合。
然后,集合S與其自身n次的笛卡爾積S n可以通過將S n-1中的每個元組擴展為S中的每個元素來歸納定義。
(這里我使用術語集和元組的數學含義,在 Haskell 實作中,它們都對應于這種情況下的串列。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474021.html
標籤:哈斯克尔
