If statement Haskell将两个int与if语句进行比较
我想实现一个名为log2的函数,它计算其参数的整数log(以2为基数)。我不能使用日志功能。我的解决方案是:检查x是否等于2^y。如果x等于2^y,则给出值y,如果x不等于2^y,则y=y+1。这将一直持续到找到y为止。到目前为止,我得到的是:If statement Haskell将两个int与if语句进行比较,if-statement,haskell,If Statement,Haskell,我想实现一个名为log2的函数,它计算其参数的整数log(以2为基数)。我不能使用日志功能。我的解决方案是:检查x是否等于2^y。如果x等于2^y,则给出值y,如果x不等于2^y,则y=y+1。这将一直持续到找到y为止。到目前为止,我得到的是: log2 x = y where y = 0 if x == 2^y then y else y = y + 1 当我要运行此操作时,我将得到以下错误: 错误:输入'if'时分析错误 我是Haskell的新手,所以有人能解释我出了什么问
log2 x = y where y = 0
if x == 2^y then y
else y = y + 1
当我要运行此操作时,我将得到以下错误:
错误:输入'if'时分析错误
我是Haskell的新手,所以有人能解释我出了什么问题吗?很难准确解释语法错误产生的原因,因为它与它要对应的(有效)语法并不明显。只需说您基本上已经编写了
log2 x=0
if…
。人们可能认为第二个短语是与0
相同的表达式的定义或部分,但如果既不是开头也不是
更一般地说,Haskell没有可变变量。您不能将“分配”给y
。最接近你想要的是
log2 x=until(\y->x==2^y)(\y->y+1)0
请注意,我们从来没有分配给y
,我们只是将其绑定以执行每个lambda表达式。我们可以想象它每次都有不同的名字!这很好。Haskell使用缩进和空格来表示表达式的范围。您的if
语句缩进的方式表明它不在where
子句的范围内。我是否需要将if和else语句放在where语句下面,或者做什么?感谢您的解释,如果我运行此语句并使用10 for x,它将不起作用。但是如果我用4表示x,它会。这是怎么可能的?我们如何解决这个问题?好吧,你原来的程序只适用于2
的精确幂次,对吗?改进它的一种方法是编写=
而不是=
,然后至少它会停止10
。但是您需要比每次迭代添加1
更复杂的东西来找到精确的对数。