2012-06-29 13 views
5

En el Wiki page for Sudoku solutions, una solución afirma utilizar el "Dot Hack". La página vinculada de Github ya no está disponible y no pude encontrar nada al respecto.Haskell "Dot Hack"

¿De qué se trata? ¿Qué hace? ¿Cómo?

+0

Me pregunto si está relacionado con la serie .hack. – Pubby

Respuesta

5

supongo que se está refiriendo a la siguiente línea:

import Prelude hiding ((.)) 

que desactiva el (.) operador normal para composición funcional. En su lugar, se usa otro operador con el mismo nombre, probablemente importado del módulo de utilidad T.T. Este operador se comporta como en lenguajes de POO:

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

la que (creo) que normalmente se verá como

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

Ese operador funciona de la misma como el operador |> en Fa #:

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

que se utiliza para tubería un valor a través de funciones (y es más legible y mejor estilo funcional, imo):

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

(|>) es también el mismo que flip ($).

Editar: Este operador "pirateado" ya existe en Haskell, de alguna manera. El mismo comportamiento composición se puede lograr mediante el operador de composición de izquierda a derecha desde Control.Category: sólo

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

Este tuberías funciones, sin embargo, y es en realidad sólo f >>> g = g . f.

+0

También le gustaría leer [this] (http://stackoverflow.com/q/1457140/1346276), tratando algunos problemas con ambas versiones. – phg

4

Se trata de utilizar el estilo de programación orientada a objetos

thing.method 

para llamar a funciones en thing en lugar del habitual

method thing 

Véase, por ejemplo

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 

en ese programa.