我在Haskell中具有以下功能:
invertedSum :: Integer -> Integer invertedSum n = n + (read . reverse . show) n
我需要知道为了使这个数字成为capicua,必须做的总数。也就是说,
invertedSum 1999 = 11990 (1999+9991) invertedSum 11990 = 21901 invertedSum 21901 = 32813 invertedSum 32813 = 64636 invertedSum 64636 = 128282 invertedSum 128282 = 411103 invertedSum 411103 = 712217 isCapicua :: Integer -> Bool isCapicua n | show n == (reverse . show) n = True | otherwise = False isCapicua 712217 == True
所以,我想生成以下列表,但我不知道如何生成。
sumUpToCapicua 1999 = [11990, 21901, 32813, 64636, 128282, 411103, 712217]
genericLength (sumUpToCapicua 1000000079994144385) == 259
您已经有了一个函数 invertedSum 使用类型 Integer -> Integer . 如果我正确理解了这个问题,您可以多次应用它,从特定的 Integer (例如。 1999 ).
invertedSum
Integer -> Integer
Integer
1999
你可以使用 iterate 为此目的。其类型为:
iterate
Prelude> :t iterate iterate :: (a -> a) -> a -> [a]
换言之,它将具有任何功能 a -> a ,以及初始值 a ,并生成 极大的 列表(共个) 一 价值观
a -> a
a
一
就你而言, 反相器 具有类型 整数->整数 ,以及要使用的初始值(例如。 1999 )也属于 整数 ,因此它非常适合: 一 可能是 整数 .
反相器
整数->整数
整数
尝试使用 反相器 和例如。 1999 具有 迭代 . 请注意,这会产生 极大的 因此,如果您在GHCi中尝试此功能,您可能希望使用例如。 take 10 限制生成的值的数量。
迭代
take 10