我创建了一个:
newType Board = Board (Array (Int, Int) Life)
,其中
data Life = Alive|Dead
我试图通过模式匹配来创建一个将板保存到String的函数:
showBoard:: Config -> String
showBoard Board(array ((0, 0), (w, h)) [(a:as)]) = *code*
但这只能让我在模式中解析错误:array"。我看不出有什么不对?
答案 0 :(得分:4)
您只能对数据构造函数进行模式匹配。 array
不是数据构造函数;它是一个常规函数,内部使用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) = ...