Сигма-знак в haskell

#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 нижний индекс во втором аргументе to fn . Таким образом, это не вычисляет, что говорится в уравнениях. (Если, конечно, это не опечатка в уравнении.)

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 , фактически вызывающую ее на каждом шаге).