haskell - 在haskell语言的谓词中绑定let的问题?
问题描述
我是haskell语言的新手。我编写了函数获取对列表作为输入并返回 BMI 索引列表:
calcBMI:: (RealFloat a)=> [(a,a)]->[a]
calcBMI xs = [ result | (w,h)<-xs, let bmifunc (w,h)= w/h^2; result =bmifunc (w,h) in result >=25]
当我在ghci中保存并:reload时,错误:不在范围内:`result'失败,模块已加载:没有出现。我认为列表理解不知道我在列表理解谓词中引入的结果是什么。请告诉我为什么?以及如何解决问题
解决方案
中定义的任何变量let ... in
仅在 之后的表达式中有效in
。所以,你不能result
在其他任何地方使用你的。let x = ...
幸运的是,Haskell 列表理解表达式允许您通过简单地添加一个生成器,在其中定义可在表达式中的任何位置引用的变量。因此,而不是写
calcBMI xs =
[result | (w, h) <- xs,
let bmifunc (w, h) = w / h ^ 2;
result = bmifunc (w, h)
in result >= 25]
你可以写
calcBMI xs =
[result | (w, h) <- xs,
let bmifunc (w, h) = w / h ^ 2;
result = bmifunc (w, h),
result >= 25]
并且代码将编译。
推荐阅读
- android - 如何在 Android 中获取当前连接的 BLE 外围设备
- apache-zookeeper - ZooKeeper(InterProcessMutex)中锁路径参数如何工作?
- python - 实时视差图项目:无法识别颜色图视差(OpenCV Python StereoBM)
- x3d - 在哪里可以找到 X3D-Edit 3.3 更新的下载
- java - 尝试在进行事务时在空对象引用上调用虚拟方法“int java.lang.String.length()”
- go - Beego如何支持HTTPS
- python - Python:按顺序执行步骤
- selenium-ide - 如何使用 Selenium IDE 在新选项卡中运行测试
- javascript - Javascript游戏中的对象碰撞
- gradle - 在 Gradle buildSrc 和项目之间共享代码