无法匹配预期的类型(新类型)

时间:2019-12-25 01:15:36

标签: haskell newtype

我正在使用函数

createTypeBoard :: (Int, Int) -> CellType -> Board

使用这些类型

newtype Board = Board [(Cell, CellType)] deriving(Eq)

data CellType  = Mine                
           | Flag                    
           | Void                     
           | Enumerated Int          
           | Undiscovered             
           deriving Eq

type Cell = (Int, Int)

createTypeBoard(2,2)我的应该是:Board [[((1,1),X),((1,2 ,, X),((2,1),X),((2,2 ),X)]

(X是Mine的演出实例)

我的想法是使用zip:

createTypeBoars (a, b) c = zip (createCells (a, b)) [c]

但我不断收到错误消息

• Couldn't match expected type ‘Board’
              with actual type ‘[(Cell, CellType)]’
• In the expression: zip (createCells (a, b)) [Flag]
  In an equation for ‘createTypeBoard’:
      createTypeBoard (a, b) Flag = zip (createCells (a, b)) [Flag]

板子基本上是[(Cell,CellType)],所以我真的不明白问题出在哪里:(

1 个答案:

答案 0 :(得分:2)

您使用Board声明了newtype,但是您试图像使用type声明一样使用它。修复它的两种选择:

  1. 改为这样声明boardtype Board = [(Cell, CellType)]
  2. 使用Board中的createTypeBoard数据构造函数,如下所示:createTypeBoard (a, b) c = Board $ zip (createCells (a, b)) [c]

有关typenewtype之间的差异(可能会影响您决定采用哪种修补程序的决定)的更多信息,请参见Haskell type vs. newtype with respect to type safety和/或The difference between type and newtype in Haskell。 / p>