我必须定义lowestPower
以便
lowestPower :: Integer -> (Integer,Integer)
lowestPower n
是(k, m)
对,其中m
是2的最低幂,其十进制表示以数字n
开头,k
是其指数(即2^k = m
)。例如,
lowestPower 3 == (5,32)
lowestPower 7 == (46,70368744177664)
fst (lowestPower 982) == 3973
我试过这个:
lowestPower :: Integer -> (Integer,Integer)
lowestPower n = (k,m)
where
k <- [0..]
(head . cifras) m = n
2^k = m
cifras :: Integer -> [Integer]
cifras n = [read[d] | d <- show n]
答案 0 :(得分:2)
k <- [0..]
不是您可以在where
块中编写的内容。 where
阻止 define 的东西,可能取决于封闭范围内的参数,但它们无法处理这种“循环结构”。你也不能使用方程式作为条件,例如(head . cifras) m = n
。这两者都更像是逻辑编程,但Haskell是功能性的,即它不解决命题而只是简单地指定函数方程。即所有=
行的格式必须为
newVariableOrFunction 〘..arguments..〙 = some expression that can be computed
您可以使用列表理解编写与原始代码非常相似的内容,即您基本上可以明确地量化所有可想到的值。像
lowestPower n = head
[ (k,m)
| k <- [0..]
, let m = 2^k
, (head . cifras) m == n
]
由于列表理解基本上只是实现循环的一种方式,因此通过递归定义函数更为自然。