2012-06-29 6 views
5

Wiki page for Sudoku solutionsでは、1つの解決策が「ドットハック」を使用すると主張している。リンクされたGithubのページはもう利用できず、私はそれについて何も見つけられませんでした。ハスケル「ドットハック」

これは何についてですか?それは何をするためのものか?どうやって?

+0

.hackシリーズに関連しているのだろうかと思います。 – Pubby

答えて

5

私は彼が次の行を参照することだと思う:

import Prelude hiding ((.)) 

機能的組成物のための通常の(.)オペレータを無効にします。その代わりに、おそらくユーティリティモジュールT.Tからインポートされた同じ名前の別の演算子が使用されます。通常

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

その演算子のようになります(と思う)

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

F#で|>オペレータのように同じように動作します:この演算子は、OOP言語のように振る舞う

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

これは、関数を介して値をパイプに使用されています(そして、より読みやすく、より機能的なスタイル、imo):

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

(|>)flip ($)と同じです。

編集:この "ハッキングされた"演算子はすでにハスケルに存在しています。しかし

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

このパイプのみ機能、および実際にはf >>> g = g . fある:同じ組成の動作はControl.Categoryから左から右への組成物のオペレータによって達成することができます。

+0

[this](http://stackoverflow.com/q/1457140/1346276)も読んで、両方のバージョンでいくつかの問題を扱いたいかもしれません。 – phg

4

ではなく通常の

method thing 

thing上の機能を呼び出すことがOOPスタイル

thing.method 

を使用していますが、そのプログラムで

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 

例えば参照してください。