5

数独解决方案的 Wiki 页面中,一种解决方案声称使用“Dot Hack”。链接的 Github 页面不再可用,我在别处找不到任何关于它的信息。

这是关于什么的?它有什么作用?如何?

4

2 回答 2

6

我猜他指的是以下行:

import Prelude hiding ((.))

这会禁用(.)功能组合的正常运算符。相反,使用了另一个具有相同名称的运算符,可能是从实用程序模块导入的T.T。此运算符的行为类似于 OOP 语言:

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

(我认为)通常看起来像

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

该运算符的工作方式与|>F# 中的运算符相同:

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

它用于通过函数传递值(并且更具可读性和更好的功能风格,imo):

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

(|>)也一样flip ($)

编辑:不知何故,这个“被黑”的运算符已经存在于 Haskell 中。从左到右的合成运算符可以实现相同的合成行为Control.Category

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

但是,此管道仅起作用,实际上只是f >>> g = g . f.

于 2012-06-29T08:37:56.417 回答
4

它使用 OOP 风格

thing.method

调用函数thing而不是通常的函数

method thing

参见例如

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

在那个节目中。

于 2012-06-29T08:33:36.463 回答