【问题标题】:Find index of largest Integer查找最大整数的索引
【发布时间】:2020-02-27 12:40:03
【问题描述】:

我正在涉足一些 Haskell,但偶然发现了路上的颠簸

我想编写一个 AI 用来在简单棋盘游戏中选择行的函数。所述游戏中的棋盘由整数列表表示。像这样:

board = [1,2,3,4,5]

棋盘行中数字的索引 + 1 和Int 本身就是所述行中剩余的棋子数。我的目标是如何让这个函数工作,首先在列表中找到最大的数字,然后以IO Int 的形式返回这个数字的(索引+1)。

这是我苦苦挣扎的地方,因为我似乎无法在网上找到任何好的答案

这是我目前正在使用的:

-- Returns index of row with largest number along the number itself
aiHelper :: Board -> (Int, Int)
aiHelper xs = maximumBy (comparing fst) (zip xs [1..])

-- Returns row with largest number as IO Int
aiRow :: Board -> IO Int
aiRow xs = do
              let y = snd $ aiHelper xs
              return $ y

我不太确定这段代码是否符合我的要求,我的代码是否有更简单、更简洁的解决方案?

【问题讨论】:

    标签: list haskell integer


    【解决方案1】:

    你可以像这样简化代码:

    aiRow :: Board -> IO Int
    aiRow xs = return $ snd $ aiHelper xs
    

    或者,通过发送Eta reduction,到此:

    aiRow :: Board -> IO Int
    aiRow = return . snd . aiHelper
    

    但是,实际上,您不需要返回 IO Int。为什么不只是以下?

    aiRow :: Board -> Int
    aiRow = snd . aiHelper
    

    不过,此时您可能低于Fairbairn threshold

    【讨论】:

    • 不错,之前没听过“费尔贝恩门槛”这个词。
    • 确实很好的答案
    • 我最喜欢的超过费尔贝恩阈值的例子(几乎)只是因为很少有人会想到最有效的方法是Data.Sequence.intersperse。我为此感到非常自豪。
    【解决方案2】:

    在 Mark 的提议之后,aiRow 现在自己做的很少,你不妨将它与aiHelper 结合起来:

    maximumIndex :: Ord a => [a] -> Int
    maximumIndex = fst . maximumBy (comparing snd) . zip [1..]
    

    (切换fstsnd。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 2022-01-12
      • 2021-06-20
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多