匹配数组的模式

时间:2016-11-06 14:37:10

标签: arrays pattern-matching

我创建了一个:

 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"。我看不出有什么不对?

1 个答案:

答案 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) = ...