Почему моя 'находка' не работает как, я ожидаю использовать - должностное лицо?

Являются ли переменные типа в предложениях «где» в том же пространстве имен с родителями?

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, см. более позднюю часть ответ.

14
задан Jonathan Adelson 17 March 2009 в 16:52
поделиться

4 ответа

Вы не должны помещать rm -rf {} в одинарные кавычки.

, Поскольку Вы заключили его в кавычки, оболочка рассматривает все аргументы -exec это как команда, а не команда плюс аргументы, таким образом, это ищет файл, названный "rm -rf ./src/.svn", и не находит его.

Попытка:

find . -iname .svn -exec rm -rf {} \;
27
ответ дан 1 December 2019 в 07:06
поделиться

Просто кстати необходимо, вероятно, выйти из привычки к использованию - должностное лицо для вещей, которые могут быть сделаны в несколько файлов сразу. Например, я записал бы, что из привычки как

find . -iname .svn -print | xargs rm -rf

или, так как я теперь использую Macintosh и более вероятно встретиться с именами файла или каталога с пробелами в них

find . -iname .svn -print0 | xargs -0 rm -rf 

, "xargs" удостоверяется, что "комната" вызывается только один раз в файлы "N", где "N" обычно равняется 20. Это не огромная победа в этом случае, потому что комната является маленькой, но если бы программа, которую Вы хотели выполнить на каждом файле, была большой или сделала большую обработку на запуске, то это могло сделать вещи намного быстрее.

7
ответ дан 1 December 2019 в 07:06
поделиться

Попробуйте

find . -iname .svn -exec rm -rf {} \;

, и это, вероятно, должно работать IIRC.

1
ответ дан 1 December 2019 в 07:06
поделиться

Можно также использовать команду svn следующим образом:

svn export <url-to-repo> <dest-path>

здесь Ищут больше информации .

1
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: