Haskell присваивает значение переменной внутри понимания

У меня возникли проблемы со следующим упражнением:

Я должен написать функцию, которая представляет собой 3 числа, x y n, являющиеся x и y нижней и верхней границами понимания списка (соответственно), а n - количество разделов, которые будет иметь понимание.

E.g:

λ> 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 `='

ПРИМЕЧАНИЕ. Предполагается, что это упражнение для начинающих, и оно должно иметь простое решение.


person eXistanCe    schedule 24.07.2015    source источник


Ответы (2)


Вам просто нужно использовать ключевое слово 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]
person rampion    schedule 24.07.2015
comment
Результаты отличаются. Связано. - person user3237465; 24.07.2015
comment
О, я не знал, что мог бы использовать впустить понимание, спасибо. Но таким образом список увеличивается до y + b ( 22,5), а не только до 20,0, как я могу это исправить? - person eXistanCe; 24.07.2015
comment
@user3237465 user3237465 Я не думаю, что это связано. Ошибка здесь в использовании a+b вместо a, а не в забавных правилах нумерации Haskell. - person Daniel Wagner; 24.07.2015
comment
@ Даниэль Вагнер, да, я не смотрел на первое число и длину списка. В любом случае, использовать перечисления для таких поплавков небезопасно. - person user3237465; 24.07.2015

Какие переменные? Все неизменно :)

Вам нужно выражение 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]]
person 9000    schedule 24.07.2015
comment
Вероятно x,b..y -> x,x+b..y - person chi; 24.07.2015
comment
@chi: это имеет смысл, хотя я только что исправил синтаксис, а не семантику. - person 9000; 24.07.2015