模式同义词提供了一种表达值的简写方式;他们还可以提供一个抽象名称以避免客户端模块破坏数据声明。这是一个不太有用的例子,作为讨论的例子:
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
我正在阅读的长字符串文字中以制作数据结构。
有任何想法吗?