获得不同权力的数量

时间:2017-11-01 11:57:29

标签: haskell

我编写了一个Haskell程序,用于计算列表中不同功率的数量。

函数dist接受2个整数m n。该程序计算列表的长度,该列表包含所有数字a ^ b,其中2 <= a&lt; = m且2&lt; = b&lt; = n;数字a ^ b仅在列表中添加一次

示例

dist 5 5

-- 2^2,2^3,2^4,2^5,3^2,3^3 .....5^4,5^5 --

只有15个不同的值4,8,9,16,25,27,32,64,81,125,243,256,625,1024,3125所以答案是15。

我的代码是否有任何改进可以使其更快?或者可能是某人建议的其他方法?

import Data.List

dist :: Int -> Int -> Int
dist m n =  length (nub (concat [x | a<-[2..m], let x = listpower a n] ))


listpower::Int->Int->[Int]
listpower a n = take (n-1) (powers a)


powers::Int->[Int]
powers a = [a^b| b<-[2..]]

1 个答案:

答案 0 :(得分:2)

列表的Applicative实例使这一点变得微不足道。

dist m n = length . nub $ (^) <$> [2..m] <*> [2..n]

(^) <$> [2..m]会生成一系列函数fs = [(2^), (3^), ..., (m^)]。然后fs <*> [2..n]将这些函数中的每一个应用于[2..n]中的每个值。

还有一个简单的列表理解,如

f <$> xs <*> ys == [f x y | x <- xs, y <- ys]