Square該函式的目標是以s串列的形式獲取一個棋盤,True如果沒有Square包含白色且在下一行中與它對角相鄰的綠色正方形,則回傳。
函式簽名是:
diagchecker :: [[Square]] -> Bool
正方形定義為:
data Square = White | Green | Empty deriving Eq
例如,diagchecker [[White,Empty],[Empty,Green]]應該回傳False.
diagchecker [[Green,Empty],[Empty,White]]應該回傳True。
diagchecker [[White,Green],[White,White],[Green,Empty]]應該回傳False。
- - - - -更新 - - - - - -
好的,我基本上離做對了只有一步之遙。這是我的代碼:
data Square = White | Green | Empty deriving Eq
diagchecker :: [[Square]] -> Bool
anyDiags :: (a -> a -> Bool) -> [[a]] -> Bool
anyDiags p = fst . foldr f (False, [])
where
f xs (a, ys) = ( a || or (zipWith p xs (drop 1 ys))
|| or (zipWith p (drop 1 xs) ys)
, xs)
greenAfterWhite x y = (x == White && y == Green)
diagchecker = anyDiags greenAfterWhite
這段代碼確實有效,現在我面臨的唯一問題是我想在白后沒有綠色時回傳,在白diagchecker后有綠色時回傳。在當前情況下,它正在檢測白色之后是否有綠色,但它回傳的結果布林值與我想要的完全相反。誰能幫我解決這個問題?TrueFalse
-----更新2號-----
為了改變輸出,我試過greenAfterWhite這樣改變:
greenAfterWhite x y
| (x == white && y == green) = False
| otherwise = True
或這個:
greenAfterWhite x y = not (x == White && y == Green)
這兩種變化都會導致每一個輸入的diagchecker回報。TRUE[[Square]]
uj5u.com熱心網友回復:
由于您只檢查下面的兩個對角正方形,我將其表示為尾部映射。歡迎您根據以下內容重新制定它foldr:
import Data.List (tails)
diagchecker = noGreenUnderWhiteDiagonally
noGreenUnderWhiteDiagonally rows =
null [ ()
| (a:b:_) <- tails rows,
greenUnderWhite a (drop 1 b)
||
greenUnderWhite (drop 1 a) b]
greenUnderWhite row1 row2 =
or $ zipWith (...) ... ...
如果上面的正方形是白色的,您將需要完成定義以檢查下面是否存在綠色正方形。
or將檢測其引數串列中是否存在任何True元素。
否定已經內置到代碼中,并null檢測其引數串列是否為空。該串列的元素并不重要,因此我們使用“平淡無奇”的值,().
上的映射tails實作了矩陣中連續行的成對比較。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462815.html
下一篇:從邊串列中查找連通分量
