#haskell
#haskell
Вопрос:
Как я могу реализовать sth. нравится знак сигмы в haskell?
То, что я хочу вычислить, это:
http://img6.imagebanana.com/img/dulfkvz8/form.png
РЕДАКТИРОВАТЬ: я не хочу представлять греческий символ. Я хочу вычислить сумму.
заранее спасибо
Комментарии:
1. Вы хотите использовать греческую букву в исходном коде вашей программы или вы хотите что-то суммировать?
2. не греческая буква, я хочу подвести итог.
3. Я бы рекомендовал не использовать слово «знак» в вашем названии, если то, что вы ищете, не является фактическим символом сигмы.
4. Я не уверен, что ссылка правильная; вы имеете в виду
(x{sub i}, x{sub i 1))
?
Ответ №1:
Предполагая, что у вас есть x
значения в списке (не emtpy) xs = [x1, x2, ... xn]
, вы можете записать его как
sum $ zipWith fn xs (tail xs)
Комментарии:
1. Для этой конкретной проблемы, вероятно, это правильный путь.
2. Вероятно, он менее продвинут, чем вы думаете. Функция
zipWith
принимает 3 аргумента: первый аргумент — это функция (fn
), а второй и третий аргументы — списки. Если вы проверите онлайн-документацию, вы увидите, чтоzipWith
использует аргумент функции для попарного объединения элементов в двух списках и возвращает результаты в виде списка (длина которого равна длине более короткого входного списка).3. И когда вы используете
zipWith
в сочетании сtail
, как здесь, вы можете применить свою функциюfn
к каждой «смежной» паре в списке.4. Вы понимаете, что это
x
нижний индекс, а неi
нижний индекс во втором аргументе tofn
. Таким образом, это не вычисляет, что говорится в уравнениях. (Если, конечно, это не опечатка в уравнении.)5. Хорошее наблюдение, trinithis: D Я думаю, однако, можно с уверенностью предположить, что это опечатка, поскольку
x
в подмножестве здесь является неопределенной свободной переменной (я видел примеры, в которых использовалось то же имяx
, ноx
-у-которого-всегда-есть-индекс отличался отx
-всегда без индекса) или просто бессмысленно.
Ответ №2:
Почему не простая рекурсивная функция?
sigma 0 fn = fn
sigma i fn = fn (sigma (i-1) fn)
Комментарии:
1. Обратите внимание, что этот подход (наивная рекурсия) имеет довольно ужасное поведение для более длинных последовательностей. Кроме того, эта конкретная реализация предназначена только
fn * (i 1)
дляn >= 0
и для бесконечного циклаi < 0
(вам нужно было бы создатьfn
функциюi
, фактически вызывающую ее на каждом шаге).