2012-06-29 11 views
5

Nel Wiki page for Sudoku solutions, una soluzione afferma di utilizzare "Dot Hack". La pagina Github collegata non è più disponibile e non sono riuscito a trovare nulla al riguardo.Haskell "Dot Hack"

Di cosa si tratta? Che cosa fa? Come?

+0

Mi chiedo se è correlato alla serie .hack. – Pubby

risposta

5

Credo che abbia riferimento alla seguente riga:

import Prelude hiding ((.)) 

che disabilita la normale (.) operatore per la composizione funzionale. Invece, viene utilizzato un altro operatore con lo stesso nome, probabilmente importato dal modulo di utilità T.T. Questo operatore si comporta come in linguaggi OOP:

pretty_output solution = solution.elems.map(show).in_group_of(9) 
    .map(unwords).unlines 

che (credo) normalmente simile

pretty_output solution = (unlines . map unwords . in_group_of 9 . map show . elems) solution 

Tale operatore funziona allo stesso modo come la |> operatore in F #:

(|>) :: a -> (a -> b) -> b 
x |> f = f x 

che viene utilizzato per pipe un valore tramite le funzioni (ed è più leggibile e migliore stile funzionale, imo):

pretty_output solution = solution |> elems |> map show |> in_group_of 9 |> map unwords |> unlines 

(|>) è lo stesso di flip ($).

Modifica: questo operatore "compromesso" esiste già in Haskell, in qualche modo. Lo stesso comportamento composizione può essere ottenuto dall'operatore composizione sinistra a destra da Control.Category: solo

g x = x |> (f1 >>> f2 >>> f3) 

This tubi funzioni, però, ed è in realtà solo f >>> g = g . f.

+0

Ti potrebbe interessare anche leggere [questo] (http://stackoverflow.com/q/1457140/1346276), trattando alcuni problemi con entrambe le versioni. – phg

4

E 'utilizzando lo stile OOP

thing.method 

di chiamare funzioni thing invece del solito

method thing 

Si veda ad esempio

row i = i `div` 9 
col i = i `mod` 9 
row_list i positions = positions.select(on_i_row) where 
    on_i_row pos = pos.row == i.row 
col_list i positions = positions.select(on_i_col) where 
    on_i_col pos = pos.col == i.col 

in quel programma.