Hi,
import Data.List
import qualified Data.Set as S
rows :: Ord a => [[a]] -> S.Set [a]
rows = S.fromList
cols :: Ord a => [[a]] -> S.Set [a]
cols = S.fromList . transpose
diagonals :: Ord a => [[a]] -> S.Set [a]
diagonals [] = S.empty
diagonals xss = S.union
( S.fromList $ transpose (zipWith drop [0..] xss) )
( diagonals (map init (tail xss)) )
allWords :: Ord a => [[a]] -> S.Set [a]
allWords xss = S.unions
[ rows xss
, cols xss
, diagonals xss
, diagonals (map reverse xss)
]
Now you can do all sorts of things, since you have the set of all words at hand.
The function you originally wanted, checking the existence of a word can be the following:
search :: Ord a => [a] -> [[a]] -> Bool
search word xss = not $ null [ () | xs <- S.toList (allWords xss), word `isPrefixOf` xs ]
But I suppose a function which removes the found word from the set could be more useful.
Please ask if you have any questions about the above code, I can try to elaborate.
Hope this helps,
Ozgur