if-statement - Haskell 比较两个 int 和 if 语句
问题描述
我想实现一个名为 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
,但if
两者都不是开头。
更一般地说,Haskell 没有可变变量。您不能“分配”给y
. 最接近你想要的东西是这样的,
log2 x = until (\y -> x == 2^y) (\y -> y + 1) 0
请注意,我们从未分配给y
,我们只是将其绑定以执行每个 lambda 表达式。我们可以想象它每次都会收到不同的名字!那很好。
推荐阅读
- f# - 我可以在 F# 的有区别的联合中直接使用代表吗?
- c++ - 在 Pybind11 中使用自动转换
- android - 从 Listview (Fragment) 的 onClick 方法启动 Activity
- c# - 在一个查询中执行 2 次搜索
- java - 填充和打印个人 LinkedList 复制的元素
- c - 将字符串转换为 Int 并再次返回字符串 C
- r - 如何尊重 R ggplot2 中离散/组变量的定量性质?
- sql-server - 更新和插入语句之间的存储过程“忘记”字段
- google-drive-api - Create file/folder on Shared drive via service account
- batch-file - 如何将文件夹的每个子文件夹中特定年份修改的所有文件压缩为每个子文件夹一个ZIP文件?