2015-07-24 4 views
2

У меня возникли некоторые проблемы с упражнением:Haskell присвоение значения переменного внутри понимания

Я должен написать функцию, которая THATS 3 числа, xyn, будучи й и у нижнего и верхнего границы понимания списка (соответственно), а 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]] 

Я не понимаю, почему я не могу определить значение переменной Ь внутри понимания, так как когда я пытаюсь запустить его, я получаю следующее сообщение об ошибке:

parse error on input `=' 

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

ответ

7

Вам просто нужно использовать 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] 
+0

Результаты отличаются. [Релевантные] (http://stackoverflow.com/questions/7290438/haskell-ranges-and-floats). – user3237465

+0

О, я не знал, что смогу использовать в понимании, спасибо. Но таким образом список поднимается до y + b (22.5) вместо перехода только к 20.0, как я могу его исправить? – eXistanCe

+2

@ user3237465 Я действительно не думаю, что это связано. Ошибка здесь использует 'a + b', а не просто' a', а не что-то вроде смешных правил перечисления Haskell. –

3

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

То, что вы хотите это 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]] 
+2

Возможно, 'x, b..y' ->' x, x + b..y' – chi

+0

@chi: это имеет смысл, хотя я просто исправил синтаксис, а не семантику. – 9000

Смежные вопросы