Почему зависимости Shake явно «необходимы»?

Я нашел первый пример использования Shake, демонстрирующий шаблон, который кажется подверженным ошибкам:

    contents <- readFileLines $ out -<.> "txt"
    need contents
    cmd "tar -cf" [out] contents

Зачем нам need contents, когда readFileLines читает их, а cmd ссылается на них? Значит ли это, что мы можем не требовать ApplicativeDo?


person sevo    schedule 29.02.2016    source источник
comment
Я попытался уточнить ответ, но я не уверен, что действительно добрался до сути вопроса. В чем вы видите потенциальную ошибку? Как вы думаете, ApplicativeDo может помочь?   -  person Neil Mitchell    schedule 29.02.2016
comment
@ Нил, спасибо за непредубежденность :) Итак, вот мое мнение. У человека, не имеющего опыта работы с Haskell, любой, казалось бы, ненужный код вызывает вопросы типа Почему вы рекомендуете писать его именно так? Решает ли это проблему ленивого ввода-вывода? Это то, как вы адаптируете параллельные задачи к Monad интерфейсу (по сравнению с Haxl использованием ApplicativeDo)? Почему бы вместо этого не определить цель tar с правильной семантикой во входных файлах? Однако я могу быть слишком осторожен со сложными вещами Haskell под Shake.   -  person sevo    schedule 01.03.2016
comment
так вы спрашиваете, зачем нужен need? Это необходимо, потому что вы должны сообщить Shake, что будет использовать tar, потому что он понятия не имеет, что делает tar. Вы правы, люди могут определить tar inp out = do need inp; cmd "tar -cf" [out] inp - и действительно, в более крупной системе сборки я бы поощрял это.   -  person Neil Mitchell    schedule 01.03.2016


Ответы (1)


Я думаю, что часть путаницы может быть связана с типами/семантикой contents. Файл out -<.> "txt" содержит список имен файлов, поэтому contents — это список имен файлов. Когда мы need contents требуем, чтобы сами файлы были созданы и от них зависели, используя имена файлов, чтобы указать, какие файлы. Когда мы передаем contents cmd, мы передаем имена файлов, которые tar будет использовать для запроса файлов.

Таким образом, ключевым моментом является то, что readFileLines не читает рассматриваемые файлы, а только читает имена файлов из другого файла. Мы должны использовать need, чтобы убедиться, что с файлами все в порядке, а затем мы фактически используем файлы в cmd. Другой способ взглянуть на три строки:

  1. С какими файлами мы хотим работать?
  2. Убедитесь, что эти файлы готовы.
  3. Используйте эти файлы.

Имеет ли это смысл? Никакого отношения к ApplicativeDo нет - его присутствие нам никак не поможет.

person Neil Mitchell    schedule 29.02.2016