2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 Re: Хвостовая рекурсия Haskell
Сообщение10.04.2020, 01:14 
warlock66613 в сообщении #1453225 писал(а):
Я бы ещё переименовал h в go - это общепринятое название для функции-шага хвостовой рекурсии и его использование упростит чтение кода другими людьми.
О, надо запомнить.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 00:45 
Оказывается я не до конца разобрался с синтаксисом и логикой Haskell. Хочу рассчитать сумму функционального ряда.

Вот например, начал с простого:
Используется синтаксис Haskell
--- просто сумма целых чисел от x1 до x2 (включительно)
sumx x1 x2 = go x1 0
    where
      go i acc = if i > x2 then acc else go (i + 1) (acc + i)


Хотелось бы сделать по аналогии. Думаю, код должен остаться почти такой же. Просто куда то добавить f. Однако не получается.

Используется синтаксис Haskell
--- сумма значений функции f от x1 до x2 (включительно)
sumfx f x1 x2 = go x1 0
    where
      go i acc = if i > x2 then acc else go (i + 1) (f (acc + i))
 

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 11:00 
gogoshik, а вот попробуйте объявить тип вашей функции как
Используется синтаксис Haskell
sumfx :: (Ord i, Num i, Num f) => (i -> f) -> i -> i -> f
и вам компилятор подскажет где ошибка.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 14:22 
gogoshik в сообщении #1453458 писал(а):
с синтаксисом и логикой Haskell

Лукавство. Напишите то же самое на любом другом языке (условно-человеческом, без фортов, аплей и брейнфаков), который вы знаете. Здесь Хаскель ни при чем, кот получится абсолютно тот же, причем для всех задач в этой теме.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 15:25 
_Ivana в сообщении #1453564 писал(а):
Лукавство.
Почему Вы так решили? Не надо разбрасываться словами!

Например, это вполне работает и мне понятно (по крайней мере с написанием кода проблем не было):
Используется синтаксис Python
from math import *
def sumfmath(f, x1, x2):
    i = x1
    accf = 0
    while i <= x2:
        currf = f(i)
        accf = accf + currf
        i += 1      
    return accf


А вот то же самое для Haskell, без циклов, понять пока не могу. Прошла одна неделя, как начал изучать Haskell. Пока не разобрался.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 15:39 
gogoshik в сообщении #1453572 писал(а):
Почему Вы так решили?

Потому что я знаю.
gogoshik в сообщении #1453572 писал(а):
Не надо разбрасываться словами!

Вам не впрок, я понимаю. Но может кто здравомыслящий эту тему будет читать.
gogoshik в сообщении #1453572 писал(а):
А вот то же самое для Haskell, без циклов

Не надо для Хаскеля, то же самое на Питоне напишите сначала, без циклов, рекурсиями, как хвостовой, так и не хвостовой.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 15:55 
gogoshik
Кстати потом не забудьте, что sumfx f x1 x2 вы сможете также записать как sum (map f [x1..x2]), ну когда уже будете использовать не в контексте изучения самого языка.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:07 
_Ivana в сообщении #1453575 писал(а):
Потому что я знаю.
Хорошо. Тогда напишите, пожалуйста, для примера следующий код в Python интерпретации:

Используется синтаксис Haskell
seQ n | n >= 0      = seqHelp n 3 2 1
      | otherwise   = error "arg must be >= 0"

seqHelp 0 _ _ pp = pp
seqHelp 1 _ p _  = p
seqHelp 2 c _ _  = c
seqHelp n c p pp = let q = c + p - 2 * pp in seqHelp (n - 1) q c p


Хотелось бы увидеть пример.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:16 
На этом форуме правила запрещают размещать за автора темы решения его простых учебных задач. И это правильно. Напишите сами, и увидите. Заодно поймете, что проблемы у вас вовсе не с Хаскелем, как вы тут всех пытаетесь убедить, а с банальной рекурсией как таковой, независимо от языка и синтаксиса. Если сложно, можете начать с фибоначч. Благо в сети они разжеваны везде.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:27 
_Ivana в сообщении #1453586 писал(а):
На этом форуме правила запрещают размещать за автора темы решения его простых учебных задач.
Моя цель -- изучить Haskell, а не Python. Задачу я на Haskell решил. Код её привел.

Используется синтаксис Haskell
seQ n | n >= 0      = seqHelp n 3 2 1
      | otherwise   = error "arg must be >= 0"

seqHelp 0 _ _ pp = pp
seqHelp 1 _ p _  = p
seqHelp 2 c _ _  = c
seqHelp n c p pp = let q = c + p - 2 * pp in seqHelp (n - 1) q c p

Поэтому Вы не нарушите правила. К тому же я ничего не утверждаю про другие языки программирования. Утверждаете Вы. Поэтому было бы с Вашей стороны честно, продемонстрировать доказательство на Python!

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:32 
gogoshik в сообщении #1453588 писал(а):
Поэтому было бы с Вашей стороны честно, продемонстрировать доказательство!

В данном случае достаточно традиционного "это очевидно" :-)

ЗЫ изучить Хаскель не умея рекурсию это примерно как научиться играть в футбол не умея ходить. И при этом списывать возникающие трудности на плохое знание правил :-)

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:52 
_Ivana
Мне вот лично кажется, что ваш вклад в этой теме недостаточно конструктивен. «А, да ты не знаешь того и этого» — это очень полезный совет, да. Человек сам бы не додумался погуглить и книжки почитать, ага. Если вам не на кого по какой-то причине выговориться, это не проблема топикстартеров раздела по программированию, уж извините.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 17:02 
arseniiv, а мне кажется, что я единственный в этой теме точно диагностировал основную причину затруднений ТС, и предложил конкретные конструктивные пути ее преодоления, вместо советов типа свертки по мапу. И что будем делать с нашими такими различными субъективными ощущениями? Если вам лично что-то кажется, то имхо можно для начала подвергнуть это непредвзятому критическому анализу, и уж совсем не обязательно озвучивать это в теме.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 19:06 

(Оффтоп)

_Ivana в сообщении #1453597 писал(а):
вместо советов типа свертки по мапу
А это совет был на будущее, чтобы ТС потом не писал велосипеды. Сейчас конечно дело в другом, просто мне хотелось сначала посмотреть на реакцию на предложение warlock66613, а потом может что-то ещё рекомендовать, если что-то останется вообще нужно, так что я добавил то дополнение, которое вреда уж точно никому не делает.

_Ivana в сообщении #1453597 писал(а):
И что будем делать с нашими такими различными субъективными ощущениями?
Ничего не будем делать. Вы действуете как считаете нужным, я тоже. Диагностика диагностикой, а можно быть как-то приветливее.

_Ivana в сообщении #1453597 писал(а):
Если вам лично что-то кажется, то имхо можно для начала подвергнуть это непредвзятому критическому анализу, и уж совсем не обязательно озвучивать это в теме.
Спасибо за совет, я им обязательно когда-нибудь воспользуюсь.

 
 
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 19:18 
 !  Может быть, педагогический диспут стоит устроить в ЛС? Хотя, _Ivana, я согласен с вашими оппонентами - пользы от такого вмешательства в беседу крайне мало.

Да, если что: правила запрещают решать простые учебные задачи за участника; если же задача сформулирована отвечающим, то ему не возбраняется ее решить.

 
 
 [ Сообщений: 30 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group