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