次の関数は明らかに 2 つのリスト内包表記の間に重複がありますが、コード全体の長さを増やさずに削除するにはどうすればよいでしょうか? ここには素敵な抽象化が潜んでいるような気がしますが、見えません...
letterAt :: [Word] -> Int -> Int -> Maybe Char
letterAt wrds x y = listToMaybe $
[wtext !! (x - wx) |
Word wx wy wtext Across <- wrds,
wy == y && x >= wx && x < wx + length wtext] ++
[wtext !! (y - wy) |
Word wx wy wtext Down <- wrds,
wx == x && y >= wy && y < wy + length wtext]
背景:
関数は、クロスワード プログラムから取得されます。クロスワードは [Word] で表されます。
data Word = Word { startX :: Int,
startY :: Int,
text :: String,
sense :: Sense }
data Sense = Across | Down
sense == Across の単語は位置 (startX, startY) から始まり、正の x 方向に続き、sense == Down の単語は正の y 方向に続きます。この関数の目的は、Just 内の (x, y) の位置にある文字を取得することです。文字が存在しない場合は Nothing を取得します。
私がここで犯した Haskell に対する他の罪を自由に指摘してください。私はこの言語を使い始めたばかりで、まだ理解しようとしています!