powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [Haskell] Хвостовая рекурсия, почему так
5 сообщений из 5, страница 1 из 1
[Haskell] Хвостовая рекурсия, почему так
    #37359772
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут 11001713 всплыла тема, копирую сюда
FishHookZyK_BotaN,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
module Main where

a=[ 1 .. 8 ]
sum' a =
    sumt a 0
    where
    sumt [] acc=0
    sumt (h:t) acc= acc `seq` sumt t acc+h
main =do
    putStrLn (show (sum'(a))) 
  
    --s<-getLine
    putStrLn "/e"
авторInstalling executable(s) in C:\Users\Smirnov\AppData\Roaming\cabal\bin
-----------------------------------------
36
/e


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
module Main where

a=[ 1 .. 8 ]

sum' a =
    sumt a 0
    where
    sumt [] acc=acc
    sumt (h:t) acc= acc `seq` sumt t acc+h




main =do
    putStrLn (show (sum'(a))) 
    
    --s<-getLine
    putStrLn "/e!!!!!!!"
автор-----------------------------------------
Installing executable(s) in C:\Users\Smirnov\AppData\Roaming\cabal\bin
-----------------------------------------
36
/e!!!!!!!
Почему не происходит присвоение sumt [] acc=0??
Почему неправильный код работает правильно??
...
Рейтинг: 0 / 0
[Haskell] Хвостовая рекурсия, почему так
    #37360074
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHook,

это не присвоение, а объявление
...
Рейтинг: 0 / 0
[Haskell] Хвостовая рекурсия, почему так
    #37360076
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHook,

используется сопоставление с образцом http://learnyouahaskell.com/syntax-in-functions#pattern-matching
...
Рейтинг: 0 / 0
[Haskell] Хвостовая рекурсия, почему так
    #37360085
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHook,

Тут нет и одного присваивания

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
# сумма а это
sum' a =
    # sumt от а и нуля
    sumt a 0
    # где 
    where
    # sumt от пустого списка и наколенного значения  это переданное накопленное значение
    sumt [] acc=acc
    # sumt от списка из головы и туловища это сумма sumt(туловища и  (аккумулятор + голова))
    sumt (h:t) acc= acc `seq` sumt t acc+h
    # `seq` означает, что acc надо вычислить перед выражением - чтобы накапливалась сумма а не граф вычисления этой суммы


Порядок вычисления примерно такой
1. вызывается sum a [1, 2, 3, 4, 5 6, 7, 8]
2. sum вызщывает sumt от a и нуля
3. в sumt ищется подходящий шаблон аргументов,
3.1 [] acc не подходит - список не пуст,
3.1 (h:t) acc подходит - список состоит из головы (первого элемента) - h и хвоста (всех остальных элементов) t
4. вызывается вариант для данного шаблона в первой итерации это будет
sumt t acc+h
t = [2, 3, 4, 5, 6, 7, 8]
acc = 0
h = 1
соответственно для уже этого вызова acc = 0+1 = 1
то есть дальше идет в пункт 3 только с новыми значениями аргументов, пока первый шаблн с пустым списком не подойдет

прочитайте про pattern matching http://www.rsdn.ru/article/haskell/haskell_part1.xml
...
Рейтинг: 0 / 0
[Haskell] Хвостовая рекурсия, почему так
    #37360324
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уже с проблемой разобрались, там все из-за приоритета.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / [Haskell] Хвостовая рекурсия, почему так
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]