Каков Потоковый Fusion Haskell

Ваш файл пуст во время работы программы:

fd = open(file_name,"w")
fd.write("#!/usr/local/bin/tcsh -f\n")
fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
fd.close

Обратите внимание на отсутствие паренсов вызовов на fd.close; вы на самом деле никогда не закрывали файл, поэтому, скорее всего, все содержимое файла находилось в буфере Python и никогда не попадало на диск до тех пор, пока программа не закончилась (когда ссылочный интерпретатор CPython, как деталь реализации, проходит и очищает глобальные переменные, закрывая открытые файлы для вас побочным эффектом, он может никогда не достигнуть диска в другом интерпретаторе).

Чтобы исправить, на самом деле позвоните close. Или, что еще лучше, переключитесь на более безопасный подход with к выражению , где close является неявным и автоматическим, происходит даже в том случае, если исключение или return заставляет вас досрочно выйти из кода: [ 1110]

with open(file_name, "w") as fd:
    fd.write("#!/usr/local/bin/tcsh -f\n")
    fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
# No need to call close; file is guaranteed closed when you exit with block

65
задан Don Stewart 17 April 2011 в 21:01
поделиться

3 ответа

Бумага, на которую указывает Логан, является большой, но это немного трудно. (Просто спросите моих студентов.) Это также много о, 'как потоковый сплав работает' и только часть, 'что потоковый сплав и как можно использовать его'.

проблема, которую решает потоковый сплав, состоит в том, что функциональные коды, как пишется часто выделяют промежуточные списки, например, для создания бесконечного списка чисел узла, Вы могли бы записать

nodenames = map ("n"++) $ map show [1..]

, Наивный код выделит бесконечный список целых чисел [1, 2, 3, ...], бесконечный список строк ["1", "2", "3", ...] и в конечном счете бесконечный список имен ["n1", "n2", "n3", ...]. Это - слишком много выделения.

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

Для использования потокового сплава необходимо записать нерекурсивные функции списка , которые используют функции из библиотеки потокового сплава, описанной в билет 915 GHC (map, foldr, и так далее) вместо явной рекурсии. Эта библиотека содержит новые версии всех функций Вводной части, которые были переписаны для использования потокового сплава. По-видимому, этот материал намечен для превращения его в следующий выпуск (6.12) GHC, но не находится в текущей стабильной версии (6.10). Если Вы хотите использовать библиотеку Porges, имеет хорошее простое объяснение в его ответе.

, Если Вы на самом деле хотите объяснение того, как потоковый сплав работает, отправьте другой вопрос---, но это намного более твердо.

63
ответ дан Chai T. Rex 24 November 2019 в 15:31
поделиться

Насколько я знаю, и вопреки тому, что сказал Norman, потоковый сплав не в настоящее время реализован в основе GHC (т.е. Вы не можете только использовать функции Вводной части). Для получения дополнительной информации см. билет 915 .

GHC Для использования потокового сплава, необходимо установить библиотеку потокового сплава, импортировать Данные. Список. Поток (можно также импортировать Управление. Монада. Поток), и только используют функции от того модуля, а не функции Вводной части. Это означает импортировать Вводную часть, скрывающую все функции списка по умолчанию и не использующую [x.. y] конструкции или понимание списка.

13
ответ дан Chai T. Rex 24 November 2019 в 15:31
поделиться

Разве это не правильно, что когда GHC в 6.12 использует эти новые функции по умолчанию, они также будут реализовывать [x..y] и перечислять понимания таким нерекурсивным способом? Потому что единственная причина, по которой они находятся в неправильном ряду, заключается в том, что они внутренние и на самом деле написаны не на Haskell, а больше похожи на ключевые слова, ради скорости и / или потому что вы не сможете переопределить это синтаксис.

-2
ответ дан 24 November 2019 в 15:31
поделиться
Другие вопросы по тегам:

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