2009-03-25 1 views

ответ

15

Нет, я боюсь, что нет. Учитывая, что F # не является чистым функциональным языком (в строгом смысле слова), было бы довольно сложно сделать это, я верю. Основным способом использования параллелизма в F # является использование Async Workflows (в основном, через модуль Async, я считаю). TPL (параллельная библиотека задач), которая внедряется с .NET 4.0, будет выполнять аналогичную роль в F # (хотя, в частности, ее можно использовать на всех языках .NET одинаково хорошо), хотя я не могу сказать, m точно, как он собирается интегрироваться с существующей инфраструктурой async. Возможно, Microsoft просто посоветует использовать TPL для всего, или, может быть, они оставят оба в качестве опции, и в конечном итоге они станут стандартом де-факто ...

В любом случае, вот несколько статей по асинхронному программированию/рабочим процессам в F #, чтобы вы начали.

+0

«Учитывая, что F # чистый функциональный язык ». Собственно, чистота не имеет значения. –

+0

@Jon: Вот где вы ошибаетесь. Это очень актуально. Компилятор не может сделать необходимые предположения таким образом. – Noldorin

+0

У нас были векторизаторы компиляторов для императивных языков, таких как Fortran на протяжении десятилетий. Я имел в виду, что они оказались практически бесполезными, как чистота в контексте многоядерного параллелизма. –

1

Нет, это не так. Вы все равно должны явно перенаправлять вызовы на другие потоки через один из многих механизмов, поддерживаемых F #.

3

Нет, я уверен, что это не будет автоматически Параллельно для вас. Было бы знать, что ваш код был побочным эффектом, что может быть трудно доказать, с одной стороны.

Конечно, F # может сделать это проще для параллелизации вашего кода, особенно если у вас нет побочных эффектов ... но это другое дело.

+0

Не существует ли система типов F # между чистыми и нечистыми функциями? Поэтому не должно быть так сложно знать, что операция была свободна от побочных эффектов. –

+0

Спасибо, Джон. Подтверждая, что вы имеете в виду, вы должны использовать такие вещи, как Контракты? –

+0

Я не знаю этого различия, но это далеко от того, чтобы сказать, что его нет. По-видимому, это исключает любое взаимодействие с каркасом, хотя и как насчет исключений? –

1

Мое понимание состоит в том, что это не будет Parallel Extensions is being modified, чтобы сделать его потребляемым с помощью F #. Который не сделает его автоматически многопоточным, должен сделать его очень простым.

+0

Хороший улов Ричард ... бег в низком сне, не могу поверить, что я написал это – JoshBerke

2

Как и многие другие, F # не будет автоматически масштабировать по всем ядрам и по-прежнему будет нуждаться в каркасе, таком как порт ParallelFX, о котором упоминал Джош.

F # обычно ассоциируется с возможностью параллельной обработки, поскольку по умолчанию объекты неизменяемы, устраняя необходимость блокировки для многих сценариев.

1

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

Я хотел бы видеть некоторое расширение до F #, которое объявляет функцию чистой. То есть, он не имеет побочных эффектов, которые не обозначаются типом функции. Идея заключалась бы в том, что функция чиста, только если она ссылается на другие «известные-чистые» функции. Конечно, это было бы полезно, только если бы тогда можно было потребовать, чтобы делегат, переданный как параметр функции, ссылался на чистую функцию.

+0

Спасибо Даниэлю. Я думал, что у F # есть «чистое» ключевое слово. Это не так? –

8

F # не делает его автоматическим, он просто упрощает процесс.

Еще один шанс для ссылки на Luca's PDC talk. Восемь минут, начиная с 52:20, представляют собой потрясающую демонстрацию рабочих процессов F # async. Это круто!

+0

Я проверю это, спасибо. –

2

По аннотациям чистоты: Code Contracts имеют атрибут Pure. Я помню, что некоторые части BCL уже используют это. Потенциально, этот атрибут может быть использован и в рамках параллелизма, но я не знаю о такой работе на данный момент. Кроме того, я даже не знаю, насколько хорошо контакты кода могут использоваться внутри F #, поэтому здесь много неизвестных.

Тем не менее, будет интересно посмотреть, как все это происходит вместе.

+0

Думаю, что я видел что-то в BCL в рефлекторе. –

Смежные вопросы