Являются ли переменные типа в предложениях «где» в том же пространстве имен с родителями?
blockquote>No *. Это становится немного легче, если вы думаете о
foo :: s -> s
в терминахfoo :: forall s. s -> s
. В конце концов, переменная типа указывает, что функция работает для любого типаs
. Давайте добавим четкие количественные значения к вашему коду:{-# LANGUAGE ExplicitForAll #-} data T s = T (s -> s) foo :: forall s. T s -> s -> s foo (T f) x = bar x where bar :: forall s. s -> s bar a = f a
Как вы можете видеть, есть два
forall s.
. Но одно вbar
неверно. В конце концов, вы не можете выбрать любойs
, но тот, который уже используется вs
. Это можно сделать, включивScopedTypeVariables
:{-# LANGUAGE ScopedTypeVariables #-} data T s = T (s -> s) -- vvvvvvvv explicit here foo :: forall s. T s -> s -> s foo (T f) x = bar x where -- vvvvvv same as above here bar :: s -> s bar a = f a
Однако есть некоторые трюки, чтобы избавиться от
ScopedTypeVariables
. Например, в этом случае:data T s = T (s -> s) foo :: T s -> s -> s foo (T f) x = (bar `asTypeOf` idType x) x where bar a = f a idType :: a -> a -> a idType a _ = a -- For completion, definition and type of 'asTypeOf' -- asTypeOf :: a -> a -> a -- asTypeOf x _ = x
Для любого
x :: s
терминidType x
имеет типs -> s
, аasTypeOf
принуждает обе иметь одинаковый тип.В зависимости от вашего фактического кода, что-то вроде этого может быть более или менее выполнимым.
* Ну, в этом случае, поскольку можно использовать
ScopedTypeVariables
, см. более позднюю часть ответ.
Вы не должны помещать rm -rf {}
в одинарные кавычки.
, Поскольку Вы заключили его в кавычки, оболочка рассматривает все аргументы -exec
это как команда, а не команда плюс аргументы, таким образом, это ищет файл, названный "rm -rf ./src/.svn"
, и не находит его.
Попытка:
find . -iname .svn -exec rm -rf {} \;
Просто кстати необходимо, вероятно, выйти из привычки к использованию - должностное лицо для вещей, которые могут быть сделаны в несколько файлов сразу. Например, я записал бы, что из привычки как
find . -iname .svn -print | xargs rm -rf
или, так как я теперь использую Macintosh и более вероятно встретиться с именами файла или каталога с пробелами в них
find . -iname .svn -print0 | xargs -0 rm -rf
, "xargs" удостоверяется, что "комната" вызывается только один раз в файлы "N", где "N" обычно равняется 20. Это не огромная победа в этом случае, потому что комната является маленькой, но если бы программа, которую Вы хотели выполнить на каждом файле, была большой или сделала большую обработку на запуске, то это могло сделать вещи намного быстрее.
Попробуйте
find . -iname .svn -exec rm -rf {} \;
, и это, вероятно, должно работать IIRC.
Можно также использовать команду svn следующим образом:
svn export <url-to-repo> <dest-path>