Y-комбинатор - это «функционал» (функция, которая работает с другими функциями), которая обеспечивает рекурсию, когда вы не можете ссылаться на функцию изнутри себя. В теории информатики он обобщает рекурсию , абстрагируя ее реализацию и тем самым отделяя ее от фактической работы рассматриваемой функции. Преимущество отсутствия необходимости во время компиляции для рекурсивной функции является своего рода бонусом. =)
Это применимо к языкам, которые поддерживают лямбда-функции . Характер лямбд на основе выражений обычно означает, что они не могут ссылаться на себя по имени. И обходить это путем объявления переменной, обращения к ней, а затем присвоения ей лямбды, чтобы завершить цикл самоссылки, является хрупким. Лямбда-переменная может быть скопирована, а исходная переменная переназначена, что нарушает самоссылку.
Y-комбинаторы громоздки для реализации и часто используются в статически типизированных языках (которыми часто являются процедурные языки ), потому что обычно ограничения на типирование требуют количества аргументов чтобы рассматриваемая функция была известна во время компиляции. Это означает, что y-комбинатор должен быть записан для любого количества аргументов, которое нужно использовать.
Ниже приведен пример того, как используется и работает Y-Combinator, в C #.
Использование Y-комбинатора предполагает «необычный» способ построения рекурсивной функции. Сначала вы должны написать свою функцию в виде фрагмента кода, который вызывает ранее существующую функцию, а не себя:
// Factorial, if func does the same thing as this bit of code...
x == 0 ? 1: x * func(x - 1);
Затем вы превращаете это в функцию, которая принимает функцию для вызова и возвращает функцию это делает так. Это называется функционалом, потому что он берет одну функцию и выполняет с ней операцию, которая приводит к другой функции.
// A function that creates a factorial, but only if you pass in
// a function that does what the inner function is doing.
Func, Func> fact =
(recurs) =>
(x) =>
x == 0 ? 1 : x * recurs(x - 1);
Теперь у вас есть функция, которая принимает функцию и возвращает другую функцию, которая выглядит как факториал, но вместо вызова самой себя она вызывает аргумент, передаваемый во внешнюю функцию. Как вы делаете это факториалом? Передайте внутреннюю функцию себе. Y-Combinator делает это, будучи функцией с постоянным именем, которая может вводить рекурсию.
// One-argument Y-Combinator.
public static Func Y(Func, Func> F)
{
return
t => // A function that...
F( // Calls the factorial creator, passing in...
Y(F) // The result of this same Y-combinator function call...
// (Here is where the recursion is introduced.)
)
(t); // And passes the argument into the work function.
}
Вместо того, чтобы сам факториал вызывать, происходит то, что факториал вызывает генератор факториала (возвращаемый рекурсивным вызовом Y-Combinator). И в зависимости от текущего значения t функция, возвращаемая из генератора, либо снова вызовет генератор, с t - 1, либо просто вернет 1, завершая рекурсию.
Это сложно и загадочно, но все встряхивается во время выполнения, и ключом к его работе является «отложенное выполнение» и разбиение рекурсии на две функции. Внутренний F передается в качестве аргумента , который будет вызываться на следующей итерации, только при необходимости .
Попробуйте другую среду рабочего стола, так как это, вероятно, ошибка в текущей среде рабочего стола и / или диспетчере окон, которая вызывает проблему - наиболее похожим будет:
] другие возможности могут быть:
Ссылки, которые я дал, содержат советы по установке и настройке.
Для наиболее похожих на Unity, используйте Gnome Версии между 3.4 и 3.8 могут быть лучшими. :
Также есть обзор поиска, если что-то лучше, чем у Unity
Если вы также хотите использовать Unity-подобный модуль запуска, используйте Dash to Dock расширение. Другими полезными вещами, делающими его более похожим на Unity, могут быть Dash Hotkeys и, возможно, это .
Расширения иногда совместимы только с разными версиями в Gnome.Shell, вы можете проверять и редактировать вещи с помощью Gnome Tweak Tool
Похоже, что папка не принадлежит вашему пользователю, поэтому вы не можете писать в нее - чтобы разобраться в этом, запустите для файла:
sudo chown USERNAME:USERNAME /PATH/TO/FILE
или это для папки / directory:
sudo chown -R USERNAME:USERNAME /PATH/TO/FOLDER
Эти команды сделают пользователя USERNAME
и группу USERNAME
владельцем указанного файла или папки.
С другой стороны, вы можете просто сделать так, чтобы «Другие» пользователи имели доступ к файлу:
sudo chmod 766 /PATH/TO/FILE
или папке:
sudo chmod -R 766 /PATH/TO/FOLDER
Вот страницы руководства на chmod
и chown
Вы можете проверить права доступа к содержимому папки, выполнив:
ls -l /PATH/TO/FOLDER
Вы должны получить что-то вроде этого:
drwxr-xr-x. 2 wilf wilf 4096 Jan 10 15:59 Desktop
drwxr-xr-x. 2 wilf wilf 4096 Jan 10 00:32 Documents
drwxr-xr-x. 3 wilf wilf 4096 Jan 10 18:25 Downloads
-rw-rw-r--. 1 wilf wilf 70582 Jan 11 22:22 gnomeRemove.txt
Где drwxr-xr-x.
- это d
директория с r
ead и e x
ecute разрешениями для всех пользователей, с w
полномочиями обряда для владельца.
Ваше имя пользователя также должно быть вместо wilf
.