Вы можете комбинировать только данные по конструкторам данных. 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) = ...
'Array' является конструктором типа; как выглядит его конструктор данных? – chepner
Im, использующий библиотеку Data.Array – Hedhed
'array' - это функция, которая возвращает значение' Array', но это не конструктор данных. 'Data.Array' не экспортирует никаких конструкторов данных, поэтому вы не можете выполнить сопоставление шаблонов по этим значениям. – chepner