
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