2012-06-29 13 views
5

W jednym ze sposobów rozwiązania problemu używa się "Dot Hack". Połączona strona Github nie jest już dostępna i nie mogę znaleźć nic na jej temat.Haskell "Dot Hack"

O co chodzi? Co to robi? W jaki sposób?

+0

Zastanawiam się, czy jest to związane z serią .hack. – Pubby

Odpowiedz

5

Chyba on odnosząc się do następującej linii:

import Prelude hiding ((.)) 

który wyłącza normalne (.) operator dla kompozycji funkcjonalnej. Zamiast tego używany jest inny operator o tej samej nazwie, prawdopodobnie importowany z modułu narzędziowego T.T. Ten operator zachowuje się w językach OOP:

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

który (chyba) normalnie wyglądać

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

że operator ten działa tak samo jak operator |> w F #:

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

który jest używany do rurki wartość przez funkcje (i jest bardziej czytelny i lepiej funkcjonalny styl, imo):

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

(|>) jest również taki sam jak flip ($).

Edytuj: Ten "zhakowany" operator już istnieje w Haskell. To samo zachowanie kompozycja może być osiągnięty przez operatora składu lewej do prawej, od Control.Category: tylko

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

Te rury funkcje, choć i to właściwie tylko f >>> g = g . f.

+0

Możesz również przeczytać [this] (http://stackoverflow.com/q/1457140/1346276), traktując niektóre problemy z obiema wersjami. – phg

4

To użyciem stylu OOP

thing.method 

wywołać funkcje na thing zamiast zwykłej

method thing 

Patrz np

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 

w tym programie.