2015-12-03 6 views
4

В настоящее время я возился с проблемой haskell относительно 2D ST-массива и рекурсии.Haskell: Как совместить скалярные и монадические значения?

Учитывая позицию 2D и массив направлений, я написал строку, возвращающую список всех полученных точек внутри массива:

let cellsAround = [resPt | dir <- directions, 
         let resPt = (fst dir + fst point, snd dir + snd point), 
         fst resPt >= 0 && fst resPt <= fst maxIdx && 
         snd resPt >= 0 && snd resPt <= snd maxIdx] 

Теперь цель состоит в том, чтобы обогатить получившиеся элементы списка с содержимым массив и я попробовал это:

cellsAround <- sequence [readArray board resPt | dir <- directions, 
         let resPt = (fst dir + fst point, snd dir + snd point), 
         fst resPt >= 0 && fst resPt <= fst maxIdx && 
         snd resPt >= 0 && snd resPt <= snd maxIdx] 

Это также отлично работает. Но цель состоит в том, чтобы получить комбинацию обоих [(Point, Int)], потому что я должен фильтровать содержимое массива.

Любые идеи, как совместить это, скажем

(resPt, readArray board resPt) 

?

ответ

2

Минимальное изменение:

sequence [(,) resPt <$> readArray board resPt 
     | ... 
+0

Большое спасибо. Я не нашел это (,) через Hoogle :-( – Hennes

+0

@Hennes '(,)' - конструктор пары, а '(,) a' - это короткий путь для записи' (\ b -> (a, b)) '. – chi

+1

, честно говоря, я предпочитаю использовать здесь' -XTupleSections', а именно 'sequence [(resPt)) <$> readArray board resPt ...', который намного удобнее и читабельнее исходного ответа. –

Смежные вопросы