Найти индекс наибольшего целого - PullRequest
2 голосов
/ 01 ноября 2019

Я играю на каком-то Хаскеле и наткнулся на неровности дороги

Я хочу написать функцию, которую ИИ использует для выбора ряда в простой настольной игре. Доска в указанной игре представлена ​​списком целых чисел. Например:

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

Индекс + 1 чисел в ряду на доске и сам Int - это количество фигур, оставшихся в указанном ряду. Я стремлюсь заставить эту функцию работать, сначала найти наибольшее число в списке, а затем вернуть (индекс + 1) этого числа в виде IO Int.

Вот где я изо всех сил, так как я не могу найти хорошего ответа на этот вопрос в Интернете

Это то, с чем я работаю до сих пор:

-- 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

Я не совсем уверен, что этот код выполняет то, что я ищу, и есть ли более простое и понятное решение для моего кода?

Ответы [ 2 ]

5 голосов
/ 01 ноября 2019

Вы можете упростить код следующим образом:

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

Или, сделав Eta сокращением , до этого:

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

Но, на самом деле,вам не нужно возвращать IO Int. Почему бы не просто следующее?

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

На данный момент, однако, вы, вероятно, ниже порога Fairbairn .

1 голос
/ 01 ноября 2019

После предложения Марка, aiRow теперь делает так мало, что вы могли бы также объединить его с aiHelper:

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

(Переключение fst и snd.)

...