【问题标题】:problem with let in binding in a predicate in haskell language?在haskell语言的谓词中绑定let的问题?
【发布时间】:2021-07-13 13:39:51
【问题描述】:

我是 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


    【解决方案1】:

    let ... in 中定义的任何变量仅在in 之后的表达式中有效。因此,您不能在其他任何地方使用您的result。幸运的是,Haskell 列表理解表达式允许您通过简单地添加 let x = ... 生成器,在其中定义可在表达式中的任何位置引用的变量。因此,而不是写作

    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]
    

    代码将被编译。

    【讨论】:

    • 作为文体方面的事情,我绝对会内联bmifunc的定义:[bmi | (w, h) &lt;- xs, let bmi = w/h^2, bmi &gt;= 25]
    猜你喜欢
    • 2019-06-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多