【问题标题】:Haskell assigning value to a variable inside a comprehensionHaskell在理解中为变量赋值
【发布时间】:2015-07-24 16:21:34
【问题描述】:

我在以下练习中遇到了一些问题:

我应该写一个函数,它是 3 个数字,x y n,x 和 y 分别是列表推导的下界和上界,n 是推导式将具有的分区数。

例如:

λ> partition 10 20 4
[10.0, 12.5, 15.0, 17.5, 20.0]

我所做的如下:

partition :: Double -> Double -> Double -> [Double]
partition x y n = [a+b | b = (y-x) / n ,  a -> [x,b..y]]

我不明白为什么我不能在理解中定义 b 变量的值,因为当我尝试运行它时,我收到以下错误消息:

parse error on input `='

注意:这应该是一个初学者练习,应该有一个简单的解决方案

【问题讨论】:

    标签: list haskell list-comprehension


    【解决方案1】:

    您只需要使用let 关键字:

    partition x y n = [a+b | let b = (y-x)/n ,  a <- [x,x+b..y]]
    

    然后你可以根据需要使用b

    λ partition 10 20 4
    [12.5,15.0,17.5,20.0,22.5]
    

    【讨论】:

    • 结果不同。 Related.
    • 哦,我不知道我可以在理解中使用 let,谢谢。但这样列表会上升到 y+b ( 22.5) 而不是只上升到 20.0,我该如何解决?
    • @user3237465 我真的不认为这是相关的。这里的错误是使用a+b 而不仅仅是a,与Haskell 有趣的枚举规则无关。
    • @Daniel Wagner,是的,我没有看第一个数字和列表的长度。无论如何,像这样对浮点数使用枚举是“不安全的”。
    【解决方案2】:

    什么变量?一切都是不可变的:)

    你想要的是一个let 表达式:

    partition x y n = [let b = (y-x)/n in a+b | a <- [x,b..y]]
    

    还要注意箭头的方向:它来自列表表达式到a,而不是相反。

    将公共子表达式从推导式中移开看起来更自然:

    partition x y n = let b = (y-x)/n in [a+b | a <- [x,b..y]]
    

    【讨论】:

    • 可能是x,b..y -> x,x+b..y
    • @chi:这是有道理的,虽然我只是修正了语法,而不是语义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2017-08-13
    • 2019-09-20
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多