簡體   English   中英

如何在haskell中分解復雜類型的別名?

[英]How to break up complex type aliases in haskell?

我碰到了這個非常古老的數獨代碼,對我來說似乎希臘語,主要是這種丑陋的類型

type T = (Int,Int) -> [Int]

例如要了解此功能

mark :: ((Int,Int),Int) -> T -> T
mark (p@(i,j),n) s q@(x,y) =
  if p==q then [n] else
  if x==i || y==j || e x i && e y j then delete n $ s q else s q
  where e a b = div (a-1) 3==div (b-1) 3

我可以用實際類型替換T

mark :: ((Int,Int),Int) -> (Int,Int)->[Int] -> (Int,Int)->[Int]
mark (p@(i,j),n) s q@(x,y) = 

現在,類型參數似乎無法正確排列。 p完全匹配,但我對“ s”感到困惑。 如果我跳入標記請求,就像這樣.....在此列表中,我可以很容易地看到它是帶有(1,2)等鍵值對的數組。這些鍵已在數獨中過濾為空格或零。

input :: String -> (Int,Int) -> [Int]
input s = foldr mark (const [1..9]) $
   [(p,n) | (p,n) <- zip idx $ map read $ lines s >>= words, n>0]

使用此列表和累加器調用mark函數,累加器是一個函數(const [1..9])。 這不適合類型簽名。

mark :: ((Int,Int),Int) -> (Int,Int)->[Int] -> (Int,Int)->[Int]

代碼的問題是我看不到我仍然不理解的mark函數的實際結果。 當它傳遞給第三個函數時,它會得到一些輸出。 關於如何理解這個斯法格蒂代碼的任何解釋?

此類型的值

type T = (Int,Int) -> [Int]

將任何數獨單元格(x,y) :: (Int,Int)的坐標映射到該單元格可能具有的一組可能值中(表示為[Int]的數字列表)。

函數const [0..9]將任何單元格映射到所有數字的集合中。 它充當數獨求解器的初始狀態:在開始時,假設任何單元格都可以具有任何數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM