gpt4 book ai didi

haskell - 如何从以下 Haskell 片段中消除重复?

转载 作者:行者123 更新时间:2023-12-02 22:29:59 25 4
gpt4 key购买 nike

下面的函数显然在两个列表理解之间存在重复,但是如何在不增加代码总长度的情况下消除呢?我有一种偷偷摸摸的感觉,这里潜伏着一个很好的抽象,但我就是看不到它......

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 犯下的任何其他错误,我才刚刚开始使用这门语言,并且仍在努力掌握它!

最佳答案

以下是关于您的代码的一些要点:

  • 如果要根据谓词选择列表的某些元素,最好使用filter
  • 因为您只想要满足特定谓词的第一个元素,您可以使用 Data.List.find

您的条件看起来是对称的,因此您可以将 transform 函数定义为

transform f x y (Word wx wy wtext Across) = f wtext wy wx y x
transform f x y (Word wx wy wtext Down) = f wtext wx wy x y

现在写代码只需要写一次条件

letterAt :: [Word] -> Int -> Int -> Maybe Char
letterAt wrds x y = (transform charValue x y) <$> find (transform condition x y) wrds
where
condition wtext wx wy x y = wx == x && y >= wy && y < wy + length wtext
charValue wtext wx wy x y = wtext !! (y-wy)

关于haskell - 如何从以下 Haskell 片段中消除重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com