Haskell"Dot Hack"

fab*_*abb 5 haskell

Sudoku解决方案Wiki页面中,一个解决方案声称使用"Dot Hack".链接的Github页面不再可用,我找不到任何关于它的信息.

这是关于什么的?它有什么作用?怎么样?

phi*_*ler 6

我猜他指的是以下行:

import Prelude hiding ((.))
Run Code Online (Sandbox Code Playgroud)

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

pretty_output solution = solution.elems.map(show).in_group_of(9)
    .map(unwords).unlines
Run Code Online (Sandbox Code Playgroud)

(我认为)通常会是这样的

pretty_output solution = (unlines . map unwords . in_group_of 9 . map show . elems) solution
Run Code Online (Sandbox Code Playgroud)

该运算|>符与F#中的运算符一样工作:

(|>) :: a -> (a -> b) -> b
x |> f = f x
Run Code Online (Sandbox Code Playgroud)

用于通过函数管道值(并且更具可读性和更好的功能样式,imo):

pretty_output solution = solution |> elems |> map show |> in_group_of 9 |> map unwords |> unlines
Run Code Online (Sandbox Code Playgroud)

(|>)也是一样的flip ($).

编辑:这个"黑客"操作符已经存在于Haskell中,不知何故.左向右组合操作员可以通过以下方式实现相同的组合行为Control.Category:

g x = x |> (f1 >>> f2 >>> f3)
Run Code Online (Sandbox Code Playgroud)

这个管道只起作用,实际上只是f >>> g = g . f.