Хаскелл. получение таких же соседей

Я студент cs, который недавно начал изучать Haskell. Я изо всех сил пытался найти способ интерпретировать на Haskell, но пока не мог. Мне нужна помощь. Вот объяснение. Есть три типа контента.

type Coord = (Int, Int)

-- Type-definition of a Cell: it is just a coordinate and an optional 
AgentType.
-- Note: the agent type is optional and is Nothing in case the cell is 
empty.

type Cell = (Coord, Maybe AgentType)

-- data definition for the agent types
  data AgentType 
    = Red       -- ^ Red agent
    | Green     -- ^ Green agent
    | Blue      -- ^ Blue agent
    deriving (Eq, Show) -- Needed to compare for equality, otherwise would need to implement by ourself

Каждая ячейка имеет либо содержимое (может быть красным, зеленым или синим), либо пустое. Я пытаюсь найти соседей, у которых одинаковый контент со всех сторон, включая диагональные пути, которых всего 8. Если 40% соседей ячейки совпадают с ячейкой, вернуть true.

-- Returns True if an agent on a given cell is happy or not
isHappy :: Double  -- ^ The satisfaction factor
    -> [Cell]  -- ^ All cells
    -> Cell    -- ^ The cell with the agent
    -> Bool    -- ^ True in case the agent is happy, False otherwise

isHappy ratio cs c
    | ratio < 0.4 = False
    | otherwise = True
    where
    moore = [(x-1,y-1),(x-1,y),(x-1,y+1),(x,y+1),(x+1,y+1),(x+1,y),(x+1,y-1),(x,y-1)]
    -- here is where I got stuck

Я составил список «Moore», который содержит все направления, но я не уверен, как сравнивать «Cell» с «Neighbours [Cell]». Моя мысль следует на другом языке программирования,

if (TheCell[X-1,Y] == TheCell)){
    stack ++;
    }
 ...
 ...
 ratio = stack / len(8);

Я искал, как интерпретировать в Haskell, но пока не нашел. Может быть, мой мыслительный процесс неверен. Пожалуйста, помогите мне в любом случае

Формат ввода, по-видимому, содержит только список ячеек, т.е. массив 1D, а не матрица 2D. Вам нужно сказать, откуда берутся x и y (возможно, путем сопоставления по параметру c). Вы не дали определение Cell. Расчет ratio может быть выражен как fold. Можете ли вы написать функцию для этого, учитывая некоторый список чисел? Тогда как вы будете генерировать этот список из координат ячеек?

moonGoose 09.04.2019 07:03

-- Определение типа ячейки: это просто координата и необязательный тип агента. -- Примечание: тип агента является необязательным и имеет значение Ничего, если ячейка пуста. type Cell = (Coord, Возможно, AgentType)

Dop3n 09.04.2019 07:26

@ATayler Спасибо за совет. Я чувствую, что мне нужно попытаться понять все это больше, потому что я еще больше запутался в вашем совете. Спасибо хоть

Dop3n 09.04.2019 07:28

тип Координата = (Int, Int)

Dop3n 09.04.2019 07:29

Сетка бесконечна? В каком случае входной список ячеек - это только непустые?

moonGoose 09.04.2019 07:32

@ATayler, о, я понял, что ты имеешь в виду. так что я должен сначала изменить список Мура .. хм

Dop3n 09.04.2019 07:33

у него есть границы. worldSize :: (Int, Int) worldSize = (20, 20)

Dop3n 09.04.2019 07:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
data Cell = Cell Coord (Maybe AgentType)

inBounds :: Coord -> Bool
inBounds (x,y) = 0 <= x && x <= fst worldSize
              && 0 <= y && y <= snd worldSize

isHappy cs (Cell (x,y) a) = ratioSameNeighbours >= 0.4
    where neighbourCoords = filter inBounds [(x-1,y-1),(x-1,y),(x-1,y+1),(x,y+1),(x+1,y+1),(x+1,y),(x+1,y-1),(x,y-1)]
          sameNeighbours = filter ((\(Cell p ma) -> p `elem` neighbourCoords && ma == a) cs
          ratioSameNeighbours = fromIntegral (length sameNeighbours) / fromIntegral (length neighbours)

То, что вы сказали, все еще немного занижено (например, может ли пустая ячейка быть счастливой?), но это только начало. Если входной массив ячеек должен быть двумерным (а не «разреженным» представлением, то есть одномерным списком только непустых ячеек), то ratio должен быть немного другим.

Ваш исходный пост должен содержать все необходимое для ответа на вопрос. Пожалуйста, отредактируйте его, если есть дополнительная информация, которую вы хотите предоставить.

moonGoose 09.04.2019 07:52
isHappy cs (Cell (x, y) a) = ratio >= 0.4 where …, и я думаю, вам нужен fromIntegral для результатов length, так как Int не Fractional.
Jon Purdy 09.04.2019 23:59

@JonPurdy imo первое изменение ухудшило читабельность, но оно более приемлемо с лучшими именами переменных. добавил fromIntegrals.

moonGoose 10.04.2019 00:25

Другие вопросы по теме