2013-04-16 20 views
8

Supponiamo seguente:Passando una funzione sulla rete in Haskell

Ho un tipo chiamato World che rappresenta uno stato di simulazione. Ho anche questo tipo sinonimo:

type Update = World -> World 

È Haskell in grado di serializzazione del tipo di aggiornamento in modo che possa essere passato attraverso la rete? O c'è qualche altro modo per farlo? Forse non sto cercando una serializzazione della logica del codice così tanto, come una sorta di puntatore o identificatore che può essere letto dall'altra parte. Sia il processo di invio che quello di ricezione eseguono lo stesso programma Haskell.

+10

Si dovrebbe esaminare 'cloud haskell', che è fondamentalmente un sistema per passare i puntatori alle funzioni assumendo che ogni lato abbia un binario corrispondente. –

+2

Considera di creare una struttura dati 'data Event = Thing | Thing2 Int | ... 'per rappresentare gli eventi atomici che possono accadere, quindi una funzione' update :: Event -> World -> World'. Puoi serializzare il semplice dato 'Event' type e passarlo (e aggiungere logging etc se vuoi) e quindi usare la funzione' update' a ciascuna estremità della connessione di rete. – AndrewC

+1

Purtroppo, in generale la risposta è no. – augustss

risposta

12

Il pacchetto è esattamente quello che hai descritto. Poiché ogni programma ha già lo stesso insieme di funzioni, un puntatore alla funzione viene passato da un processo a un altro. È stata citata la serializzazione della funzione come un potenziale obiettivo futuro, ma sembra che potrebbe richiedere un cambiamento a GHC. Lo github page è una buona risorsa per i backend esistenti. Il github-pages sembra molto carino con alcuni esempi, ma non ne sapevo nulla fino a un momento fa.

I pochi Haskell Parallel digeriscono intorno a issue 11 dove ricordo di aver imparato di più. Sicuramente prendo del tempo per esplorare github-pages So che lo sarò.

Se ricordo correttamente, ci sono semplici esempi nel pacchetto hackage o nel repository github che esplorano il furto del lavoro rispetto alla condivisione del lavoro e strategie simili.

+4

Per i curiosi: "processo distribuito" è l'incarnazione di Cloud Haskell. Esattamente perché hanno cambiato nome, non lo so, ma probabilmente è il migliore. –

3

Suggerisco di creare una struttura dati DSL. Sadly Haskell non ha le funzionalità di compilazione runtime di Lisp, ma dovrebbe essere sufficiente.