Size: a a a

2021 October 28

AP

Aleksei (astynax) Pi... in Haskell Start
описания чего?
источник

AP

Aleksei (astynax) Pi... in Haskell Start
назначение этих функций понятно по названию
источник

[

[BRM]White Rabbit in Haskell Start
Ну ладно
источник

I

Ivan in Haskell Start
++
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Опять же, берёте любую задачу поиска(вычисления) чего-то в цикле и решаете с помощью свёртки
источник

AP

Aleksei (astynax) Pi... in Haskell Start
BFS, DFS, A*, ватева
источник

AP

Aleksei (astynax) Pi... in Haskell Start
http://www.cs.nott.ac.uk/~pszgmh/fold.pdf и вот пейпер в тему, забыл совсем
источник

AP

Aleksei (astynax) Pi... in Haskell Start
"A tutorial on the universality and expressiveness of fold"
источник

AP

Aleksei (astynax) Pi... in Haskell Start
источник
2021 October 29

R

Raxkas in Haskell Start
Есть две программы:

Программа 1:
main :: IO ()
main = interact f

f :: String -> String
f s = s

Программа 2:
main :: IO ()
main = interact f

f :: String -> String
f s = reverse (reverse s)

Эти программы ведут себя по-разному - первая программа выводит вводимые строчки по мере поступления, а вторая после окончания ввода.

Но ведь функции f абсолютно эквивалентны на конечных строках.

Получается, то, что я внутри функции f два раза реверснул строку, имеет сайд-эффекты?
И, получается, что в теории можно реализовать любую интерактивную программу внутри f :: String -> String?
источник

R

Raxkas in Haskell Start
Наверное, это связано с ленивостью, но ведь порядок вычисления не должен влиять на результат.

Почему эта функция всё ещё чистая?
Вызовы двух таких функций нельзя поменять местами, так как это поменяет поведение, и т.д.
Это же всё ломает!
По-моему такое невозможно построить на лямбда-термах и на чистых функциях.

В общем, мои вопросы такие:
* Как это устроено с точки зрения лямбда-термов? Внутри получаемого аргумента-терма используются какие-то нечистые функции, или как такое поведение стало возможным?
* Видимо, я чего-то не понимаю. Где я не прав / неправильно смотрю на происходящее? Может, у кого-то тоже был такой "шок", а потом вы поняли, как к этому нужно относиться?

Буду благодарен любым ответам / пояснениям
источник

AR

Apfelsinchen Ritter in Haskell Start
f — функция чистая, а вот interact — нет.
источник

AR

Apfelsinchen Ritter in Haskell Start
interact :: (String -> String) -> IO ()

Вот её тип, где собственно IO и появляется и interact на вход принимает лишь чистые функции.
источник

AR

Apfelsinchen Ritter in Haskell Start
Под чистотой понимается, что на одинаковых аргументах функция на выходе даст одинаковый результат.
источник

AR

Apfelsinchen Ritter in Haskell Start
В случае с двумя вариантами f выше, это выполняется.
источник

AR

Apfelsinchen Ritter in Haskell Start
И именно в interact будет меняться порядок потребления ввода.
источник

R

Raxkas in Haskell Start
Я правильно понимаю, что:

С точки зрения Haskell, было бы вполне легальным такое устройство программы, при котором она выглядит как
processEvents :: [InputAction] -> [OutputAction]
Где оба списка лениво вычисляются и за счёт этого происходит взаимодействие?

Скажем, первым элементом списка-результата ставим requireRandom, после чего из списка-аргумента первым элементом берём сгенерированное число, как-будто оно всегда там лежало, и так далее.
processEvents input = [requireRandom, "Случайное число: " ++ head input]

Такое теоретически вполне можно было бы реализовать?
источник

O

Ortofax in Haskell Start
когда-то так и было реализовано
источник

O

Ortofax in Haskell Start
источник

R

Raxkas in Haskell Start
Ого
источник