Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement Haskell将两个int与if语句进行比较_If Statement_Haskell - Fatal编程技术网

If statement Haskell将两个int与if语句进行比较

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的函数,它计算其参数的整数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=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
更复杂的东西来找到精确的对数。