Извините за заголовок gore (если вы можете предложить лучше, пожалуйста). Но моя проблема в том, что я не совсем понимаю, как заставить этот блок работать. У меня есть код, который возвращает позицию 5
в списке списков. Как например:Назначьте возвращаемое значение двух функций, двум переменным, в блоке do
findFive :: [[Int]] -> (Int, Int)
findFive rs = do
x <- xPos rs 0
y <- yPos rs 0
return ((x,y))
xPos :: [[Int]] -> Int -> Int
xPos (rs:[[]]) n = n
xPos (rs:rss) n | elem 5 rs = n
| otherwise = xPos rss (n+1)
yPos :: [[Int]] -> Int -> Int
yPos (rs:[[]]) n = n
yPos (rs:rss) n | elem 5 rs = n
| otherwise = yPos rss (n+1)
Я
Но я не могу использовать мой сделать блок таким образом. Я могу заставить его работать, делая
findFive :: [[Int]] -> (Int, Int)
findFive xs = ((xPos xs 0), (yPos (transpose (xs)) 0))
Но это выглядит как-то уродливо.
Кроме того, есть ли способ заставить это работать, не отправив 0
в xPos
и yPos
?
XPOS и YPos идентичны, за исключением названия. Это совершенно не нужно и избегает всей функции. Когда вы получаете кодирование с копией и вставкой, почти всегда есть лучший способ. –
@ Code-Apprentice Да. Я заметил это, вместо этого замените его на одну функцию 'pos'. И вызовы транспонируются в списке, который я отправляю для позиции Y –
Один небольшой комментарий ... в '(yPos (transpose (xs))' вам не нужны скобки вокруг 'xs'. Помните, что в Haskell приложение-функция это простое пространство. Круглые скобки используются для указания приоритета оператора. Это не похоже на использование круглых скобок на других языках при вызове функции. Возможно, вы уже знаете это. Я просто хотел указать на будущих читателей. –