ОК, поэтому давайте сломаем это.
Если вы заинтересованы только в обычном списке Интс, вы получили
findPosition :: [Int] -> [Int]
Как вы можете осуществить это? Ну, ну, вам нужен вход для того, что вы на самом деле ищете!
findPosition :: Int -> [Int] -> [Int]
OK, прохладный. Таким образом, встроенная функция elem
сообщает вам , если Элемент, который вы хотите, есть. Но мы хотим, чтобы это было позиция. Так как? Ну, вы можете «ярлык» каждый элемент с его положением, например, так:
label :: [x] -> [(Int, x)]
label = zip [0..]
Теперь мы можем использовать filter
, чтобы найти все элементы:
find :: (Eq x) => x -> [(Int, x)] -> [(Int, x)]
find x0 = filter (\ (n, x) -> x == x0)
Но мы хотим только фактические позиции, не x
s (все они идентичны в этой точке). Таким образом, мы можем получить map fst
.
Сборка все,
findPosition :: Int -> [Int] -> [Int]
findPosition x0 = map fst . filter (\ (n, x) -> x == x0) . zip [0..]
Это здорово! Но вам нужен список списков от ints, не так ли?
Я предлагаю вам изменить спецификацию требований, чтобы возвращать каждую «координату» как кортеж, а не список. То есть, сделайте так
findPosition 8 [[1,2,8],[4,5,6],[7,8,9]] => [(1, 3), (3, 2)]
Это, вероятно, менее запутанно. Надеюсь, я дал вам достаточно намеков, чтобы понять вещи отсюда ...
Вам нужно только первое появление? Например. что нужно вернуть, когда заданы [[1,2], [1,3]], и вы хотите, чтобы позиция 1? – kaan
нет, я хочу все вхождения 1. В вашем примере он должен вернуться [[1,1], [2,1]]. Я отредактировал текст, тип возврата также должен быть списком списка. – oiyio
Нам еще нужна дополнительная информация. Что он должен вернуть, если число не происходит вообще? что ты уже испробовал? Покажи нам, что у тебя есть. –