2009-03-25 14 views

Respuesta

15

No, me temo que no. Dado que F # no es un lenguaje funcional pure (en el sentido más estricto), sería bastante difícil hacerlo, creo. La forma principal de hacer un buen uso del paralelismo en F # es usar Async Workflows (principalmente a través del módulo Async, creo). El TPL (Task Parallel Library), que se está introduciendo con .NET 4.0, cumplirá un rol similar en F # (aunque se puede usar en todos los lenguajes .NET igualmente), aunque no puedo decir que ' Estoy seguro de cómo se integrará con el marco asíncrono existente. Tal vez Microsoft simplemente aconsejará el uso del TPL para todo, o tal vez dejarán ambos como una opción y finalmente se convertirá en el estándar de facto ...

De todos modos, aquí hay algunos artículos sobre programación asincrónica/flujos de trabajo en F # para que comiences

+0

"Dado que F # no es un lenguaje funcional puro ". En realidad, la pureza es irrelevante. –

+0

@Jon: ahí es donde te equivocas. Es muy relevante El compilador no puede hacer las suposiciones necesarias de esa manera. – Noldorin

+0

Hemos tenido compiladores vectorizados para lenguajes imperativos como Fortran durante décadas. Mi punto era que demostraron ser tan prácticamente inútiles como la pureza en el contexto del paralelismo multinúcleo. –

1

No, no lo hará. Todavía debe ordenar explícitamente llamadas a otros hilos a través de uno de los muchos mecanismos admitidos por F #.

3

No, estoy bastante seguro de que no va a automáticamente parallelise para usted. Tendría que saber que su código era libre de efectos secundarios, que podría ser difícil de probar, por un lado.

Por supuesto, F # puede hacer que sea más fácil para poner en paralelo su código, especialmente si no tiene ningún efecto secundario ... pero eso es una cuestión diferente.

+0

¿El sistema de tipo de F # no distingue entre funciones puras e impuras? Entonces, no debería ser tan difícil saber que una operación no tenía efectos secundarios. –

+0

Gracias Jon. ¿Al probar que quieres decir, tienes que usar cosas como Contratos? –

+0

No conozco esta distinción, pero está muy lejos de decir que no está allí. Presumiblemente, eso elimina cualquier interacción con el marco, ¿y qué hay de las excepciones? –

1

Según entiendo, no lo hará, pero Parallel Extensions is being modified para hacerlo consumible por F #. Lo cual no hará que se multiplique automáticamente, debería ser muy fácil de lograr.

+0

Buena captura Richard ... corriendo en el sueño profundo no puedo creer que escribí eso – JoshBerke

2

Al igual que los otros mencionados, F # no se escalará automáticamente en los núcleos y aún requerirá un marco como el puerto de ParallelFX que Josh mencionó.

F # se asocia comúnmente con el potencial de procesamiento en paralelo porque se predetermina a objetos inmutables, eliminando la necesidad de bloqueo para muchos escenarios.

1

Bueno, ya tienes la respuesta, pero sólo quería añadir que creo que esta es la limitación más significativa de F # derivada del hecho de que es un lenguaje imperativo/funcional híbrido.

Me gustaría ver una extensión de F # que declara que una función es pure. Es decir, no tiene efectos secundarios que no se denoten por el tipo de función. La idea sería que una función es pura solo si hace referencia a otras funciones "conocidas-puras". Por supuesto, esto solo sería útil si fuera posible requerir que un delegado pasado como un parámetro de función haga referencia a una función pura.

+0

Gracias Daniel. Pensé que F # tenía una palabra clave "pura". No? –

8

F # no lo hace automático, simplemente lo hace más fácil.

Otra oportunidad para vincular a Luca's PDC talk. Ocho minutos a partir de las 52:20 son una increíble demostración de flujos de trabajo asincrónicos F #. ¡Oscila!

+0

Lo comprobaré, gracias. –

2

En las anotaciones de pureza: Code Contracts tienen un atributo Pure. Recuerdo haber escuchado algunas partes del BCL que ya usan esto. Potencialmente, este atributo podría ser utilizado por frameworks de paralelización también, pero no estoy al tanto de tal trabajo en este punto. Además, ni siquiera estoy seguro de cuán bien se pueden usar los contactos de código desde F #, por lo que hay muchas incógnitas aquí.

Aún así, será interesante ver cómo se combinan todas estas cosas.

+0

Creo que he visto algo en el BCL en el reflector. –

Cuestiones relacionadas