2016-11-06 3 views
0

Я создал:шаблон сопоставления массив

newType Board = Board (Array (Int, Int) Life) 

, где

data Life = Alive|Dead 

Im пытается сделать функцию, чтобы сохранить плату в строку поиска по шаблону:

showBoard:: Config -> String 
showBoard Board(array ((0, 0), (w, h)) [(a:as)]) = *code* 

Но это только дает мне «Ошибка анализа в шаблоне: массив». Я не могу понять, что случилось?

+0

'Array' является конструктором типа; как выглядит его конструктор данных? – chepner

+0

Im, использующий библиотеку Data.Array – Hedhed

+0

'array' - это функция, которая возвращает значение' Array', но это не конструктор данных. 'Data.Array' не экспортирует никаких конструкторов данных, поэтому вы не можете выполнить сопоставление шаблонов по этим значениям. – chepner

ответ

4

Вы можете комбинировать только данные по конструкторам данных. array не является конструктором данных; это регулярная функция, которая использует внутренний конструктор (ы) данных для создания и возврата значения Array. Внутренние детали из Array не подвергаются воздействию, что предотвращает их соответствие шаблону.

Вместо этого вам понадобятся функции, предоставляемые для просмотра значения Array. Они могут быть скомпонованы с функцией, которую делает.

-- bounds :: Array i e -> (i, i) 
-- elems :: Array i e -> [e] 
showConfig :: Board -> String 
showConfig (Board arr) = showConfig' (bounds arr) (elems arr) 
    where showConfig' :: ((Int,Int),(Int,Int)) -> [Life] -> String 
     showConfig' ((0,0),(w,h)) (a:as) = ... 

Если вы измените Board типа в

newtype Board = Board { getArray :: Array (Int, Int) Life } 

вы можете переписать showConfig в аппликативном стиле:

showConfig = (showConfig' <$> boards <*> elems) . getArray 
    where showConfig' ((0,0),(w,h)) (a:as) = ... 

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

  • Нет связанных вопросов^_^