模式同义词提供表达值的简写方式;他们也可以提供一个抽象名称,以避免客户端模块侵入数据decl。这是一个不太有用的,作为讨论的例子:
data MyNum = MkNum Int
pattern Zero :: MyNum
pattern Zero = MkNum 0
我可以做些什么来帮助数据捕获为Read
提供MyNum
个实例。如何为Read
获取Zero
个实例? (Zero
是伪数据构造函数,不是类型构造函数,因此该问题导致类别错误。)
我能想到的就是避免deriving (Read, ...)
MyNum
然后手工制作
instance Read MyNum where
... parse "MkNum ..."
... parse "Zero"
对于解析,Zero
应该只是MyNum
的另一个构造函数。它可以衍生出来 - 或者可以吗?
我认为任何先进的派生机制都不会对此有所帮助。因为类型是MyNum
并且是唯一关联的构造函数,即MkNum
。
我可以提供一个函数readZero :: String -> MyNum
。但我无法重载read
,因此我无法将Zero
嵌入到我正在阅读的长字符串文字中以构建数据结构。
有什么想法吗?