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 Наистина не мисля, че това е свързано. Грешката тук е използването на a+b вместо само a, а не нещо общо със забавните правила за изброяване на Haskell. - person Daniel Wagner; 24.07.2015
comment
@Daniel Wagner, да, не погледнах първото число и дължината на списъка. Както и да е, не е безопасно да се използват изброявания за плаващи числа като това. - 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