How would you count score in a Scrabble® game?
Haskell:

pointsFromWord :: [[Tile]] -&gt; [Char] -&gt; Word -&gt; Maybe Int
pointsFromWord board rack (word, (x, y), Vertical) = 
  pointsFromWord (transpose board) rack (Word word (y,x) Horizontal)
pointsFromWord board rack w@(word, (x, y), Horizontal) = 
  if (validWord board w)
    then Just (wordScore board w)
    else Nothing

validWord :: [[Tile]] -&gt; [Char] -&gt; Word -&gt; Bool
validWord board rack w@(word, (x, y), _) = x &gt;= 0 &amp;&amp; y &gt;= 0 &amp;&amp;
  y &lt; length board &amp;&amp; (a + length word) &lt; length (board!!y) &amp;&amp;
  foldl (\acc (c,t)-&gt;acc &amp;&amp; characterFits t c) True (zip word wordLocation)
    where wordLocation = take (length word) (drop x (board!!y))
          characterFits (PlacedTile letter) c = letter == c
          characterFits _ c = contains rack c

wordScore :: [[Tile]] -&gt; Word -&gt; Int
wordScore board (word, (x, y), _) = (letterScore * multiplier) + scrabbleBonus
  where
    letterScore = foldl (\acc (c,t)-&gt;acc + value t c) 0 (zip word wordLocation)
    wordLocation = take (length word) (drop x (board!!y))
    value (LetterMultiplier mult) c = tileValue c * mult
    value (PlacedTile letter value) c = value
    value _ c = tileValue c

    multiplier = foldl (\acc t-&gt;acc * wordMultValue t) 1 wordLocation
    wordMultValue (WordMultiplier mult) = mult
    wordMultValue _ = 1

    scrabbleBonus = if length (filter fromRack wordLocation) == 7
                      then 50
                      else 0
    fromRack PlacedTile = False
    fromRack _ = True

A little longer than I'd like (especially the ton of where clauses on wordScore), but seems readable enough (at least to me).
I took a few liberties with the data structures themselves - transliterating the C structures into Haskell doesn't really work.
The board structure is a list of lists of tiles - a list of tiles forms a row, and a list of rows form a board.
Words contain, in order:

A [Char] containing the exact tiles used (including blanks where a blank will be used instead of a letter). I assume this is prescreened for the no-two-blanks-next-to-each-other condition, though I suppose I could validate that as well.
An (Int, Int) tuple specifying the location of the word
An Orientation type constructed with either Vertical or Horizontal, specifying the orientation of the word.

Additionally, the player's current rack of tiles is passed separately from the word being tested, because that makes more sense.
I also assume a tileValue function which takes a character (including space) and returns the standard value of a tile depicting that character.