我想让这个工作:
type CharVector = V.Vector Char
type CharMatrix = V.Vector CharVector
data MaybeCharMatrix =
Nothing
| CharMatrix
但我无法做到以下事情:
1)模式匹配
test :: MaybeCharMatrix -> Int
test Nothing = -1 -- Doesn't matter, is just to illustrate
test <something> = ? -- Somehow be able to do: cols <something> * rows
2)导出节目实例:
instance Show MaybeCharMatrix where
show Nothing = ""
show <something> = "Cols: " ++ cols <something> ++ ", Rows: " ++ rows <something>
如何实现这一目标?还有其他有效的方法吗?
答案 0 :(得分:3)
如何使用:
type MaybeCharMatrix = Maybe CharMatrix
test :: MaybeCharMatrix -> Int
test Nothing = -1
test (Just matrix) = ...
这不允许您创建自己的自定义Show实例,因此这是另一个选项:
newtype MaybeCharMatrix = MCM (Maybe CharMatrix)
test :: MaybeCharMatrix -> Int
test (MCM Nothing) = -1
test (MCM (Just matrix)) = ...some function of matrix...
instance Show (MaybeCharMatrix) where
show (MCM Nothing) = "the nothing string"
show (MCM (Just matrix)) = ... "Cols: " ++ show (cols matrix) ++ ...
我认为你最好只使用type
别名(第一个选项)。然后,您可以使用直接对Maybe值进行操作的所有函数。
show
最适用于值的Haskell表示 - 即它应该是有效的Haskell表达式。如果您想要自定义渲染值,只需为渲染函数使用不同的名称 - 例如dumpMatrix
。
<强>更新强>
根据您的评论,您需要以下内容:
data MaybeCharMatrix = MyNothing | MyJust CharMatrix
test :: MaybeCharMatrx -> Int
test MyNothing = -1
test (MyJust matrix) = ... can use matrix here ...
instance Show MaybeCharMatrix where
show MyNothing = "my nothing"
show (MyJust matrix) = "... Cols: " ++ show (cols matrix) ++ ...
答案 1 :(得分:3)
您的问题在于数据类型声明。通常,类型声明的形式为。
data <type> <args> = <constructor 1> <args>
| <constructor 2> <args>
| ...
| <constructor n> <args>
换句话说,数据声明的每个子句中的第一个表达式被视为数据构造函数。因此,当您使用数据类型时。
data MaybeCharMatrix = Nothing | CharMatrix
Haskell将CharMatrix
视为数据构造函数而不是类型。您对Nothing
的定义也与标准库定义冲突,因此您应该更改其名称。你真正想要的是这样的。
data MaybeCharMatrix = NothingCM | JustCM CharMatrix
创建一个数据构造函数JustCM
,它以CharMatrix
为参数。然后,您可以像这样模式匹配。
test :: MaybeCharMatrix -> Int
test NothingCM = -1
test (JustCM mat) = <code>
instance Show MaybeCharMatrix where
show NothingCM = ""
show (JustCM mat) = "Cols: " ++ cols mat ++ ", Rows: " ++ rows mat