首页 > 解决方案 > 在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'失败,模块已加载:没有出现。我认为列表理解不知道我在列表理解谓词中引入的结果是什么。请告诉我为什么?以及如何解决问题

标签: haskell

解决方案


中定义的任何变量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]

并且代码将编译。


推荐阅读